2010-08-13 9 views
9

Me preguntaba si se considera o no un buen estilo para llamar a los comandos de bash dentro de un script de Python usando os.system(). También me preguntaba si es seguro o no hacerlo también.¿Es bueno llamar a los comandos de bash dentro de un script de Python usando os.system ("código de bash")?

Sé cómo implementar algunas de las funcionalidades que necesito en Bash y en Python, pero es mucho más simple e intuitivo de implementar en Bash. Sin embargo, siento que es muy hackear escribir os.system ("código bash").

Específicamente, quiero mover todos los archivos que terminan con una cierta extensión a un directorio.

En bash: * mv .ext/ruta/a/destino En Python (Pseudocódigo): para el archivo en el directorio: si file.endswith ("ext"): Archivo traslado a destino

En este caso, ¿qué debo hacer?

+0

podría implementar la funcionalidad de fiesta en una escritura del golpe de su propia y tienen pitón ejecutar el Bash Script se opone a colocar el código de código directamente en os.system()? (use la mejor herramienta para el trabajo) – Chris

+0

Bien, ¡muchas gracias por toda su ayuda! Tus respuestas han aclarado algunos conceptos erróneos en mi cabeza. Realmente aprecio todas las respuestas. – JoeB

Respuesta

15

En primer lugar, el ejemplo se utiliza mv, que es un programa en coreutils, no bash.

Usando os.system() llama a los programas externos se considera pobre estilo porque:

  • Usted está creando dependencias específicas de la plataforma
  • va a crear dependencias específicas de la versión (sí, incluso a veces cambian coreutils !)
  • Necesita verificar la existencia de comandos externos (y que están en $ PATH, y ejecutables por el usuario, etc.)
  • Debe envolver los comandos con la comprobación de errores utilizando su código de retorno. Es mucho más agradable usar códigos de error o excepciones en el idioma. (Os.system() no le permite analizar sintácticamente stdout/stderr)
  • Usted tiene que hacer frente a citar las variables con espacios a sí mismo (o escapar de ellos)
  • Python ya ha hecho el trabajo por usted por el suministro de las bibliotecas!

Mira hasta glob, para la cáscara-como coincidencia de patrones (globbing), y shutil, como ya se ha mencionado. De lo contrario, todo lo que necesita ya está en las bibliotecas estándar.

import glob 
import shutil 

for extfile in glob.glob('*.ext'): 
    shutil.move(extfile,dest) 

Además, os.system() no debe utilizarse - echar un vistazo al módulo subproceso lugar.

+1

Buena respuesta, pero me estremezco un poco cuando veo las variables llamadas "archivo" desde oculta el archivo incorporado. –

+0

Buen comentario - editado :) –

+0

Gran respuesta, pero para aquellos que buscan más información de migración de bash-> python voy a vincular a http://stackoverflow.com/questions/209470/can-i-use-python-as- a-bash-reemplazo – Nickolay

3

Siempre es mejor y mejor usar las funciones de Python para hacer este tipo de cosas. Con Python no es tan difícil escribir un script de una manera independiente del sistema operativo en lugar de usar bash.

1

No es idea, ya que hace que su secuencia de comandos sea lote menos portátil. Un script python nativo puede ejecutarse en cualquier máquina Unix o Windows que tenga instaladas las bibliotecas adecuadas de python. Cuando agrega comandos de shell en la mezcla, los rompe y, de repente, se bloquea a un subconjunto mucho más angosto.

A veces no tiene otra opción, pero si se trata de algo tan simple como eso, escribir el código de forma nativa en python tendría mucho más sentido y también sería más rápido de iniciar (ya que el proceso de python no tendrá para engendrar un nuevo caparazón solo para ejecutar un comando).

6

Echa un vistazo al módulo shutil de Python. Ofrece operaciones del sistema de archivos como mover archivos. Entre eso y el módulo os, debe tener todas las herramientas que necesita. Esto es preferible a los comandos bash por las razones que otros dijeron.

1

Los problemas de las citas sugieren que es preferible una solución de Python pura.

2

Algunas de las razones por las que debe utilizar Python puro,

  1. Mediante el uso de Python, que ya han hecho el supuesto de que se han instalado Python y las bibliotecas estándar. Al usar el código Bash dentro de Python, está haciendo esta suposición más, la suposición de que Bash está instalado y en la ruta del sistema.
  2. Mediante el uso de una combinación de dos lenguas que están haciendo el código más difícil para que otros puedan leer (no todo el mundo sabe Python y Bash)
  3. Si lo haces de la manera de Python que se siente más natural en poco tiempo - menos las líneas de código no siempre son mejores

En este caso, yo usaría ...

import os 
for filename in os.listdir('.'): 
    if filename.endswith('.ext'): 
    os.rename(filename, os.path.join('path', 'to', 'new', 'destination', filename)) 

Puede haber mejores maneras aunque

+1

Puede eliminar el archivo.endswith() si usa glob.glob ('*. Ext') en lugar de os.listdir –

0

Más en general, Python proporciona el módulo 'subproceso' que le permitirá ejecutar comandos y ejercer un control extensivo sobre su salida. Le permite "nuevos procesos de regeneración, conectarse a sus tuberías de entrada/salida/error, y obtener sus códigos de retorno":

http://docs.python.org/library/subprocess.html

Cuestiones relacionadas