Pregunta

Justo lo que dice el título:

  1. El módulo subprocess no se puede usar ya que esto debería funcionar en 2.4 y 2.5
  2. El proceso de shell no debe generarse para pasar argumentos.

Para explicar (2), considere el siguiente código:

>>> x=os.system('foo arg')
sh: foo: not found
>>> x=os.popen('foo arg')
sh: foo: not found
>>> 

Como puede ver os.system y os.popen ejecuta el comando dado (" foo ") a través de un shell del sistema (" sh "). No quiero que esto suceda (de lo contrario, los mensajes feos "no encontrados" se imprimen al programa stderr sin mi control).

Finalmente, debería poder pasar argumentos a este programa ('arg' en el ejemplo anterior).

¿Cómo se podría hacer esto en Python 2.5 y 2.4?

¿Fue útil?

Solución

Probablemente necesite utilizar el módulo de subproceso que está disponible en Python 2.4

Popen("/home/user/foo" + " arg")

>>> Popen("foo arg", shell=False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/subprocess.py", line 595, in __init__
    errread, errwrite)
  File "/usr/lib/python2.6/subprocess.py", line 1092, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

Deberá incluir la ruta completa ya que no está utilizando el shell.

http://docs.python.org/library/subprocess .html # replacementing-os-system

Alternativamente, también puede pasar subprocess.PIPE a stderr y stdout para suprimir los mensajes. Vea el enlace de arriba para más detalles.

Otros consejos

Como se describió anteriormente, puede (y debe) usar el módulo subprocess .

Por defecto, el parámetro shell es False . Esto es bueno, y bastante seguro. Además, no es necesario que pase la ruta completa, solo pase el nombre del ejecutable y los argumentos como una secuencia (tupla o lista).

import subprocess

# This works fine
p = subprocess.Popen(["echo","2"])

# These will raise OSError exception:
p = subprocess.Popen("echo 2")
p = subprocess.Popen(["echo 2"])
p = subprocess.Popen(["echa", "2"])

También puede usar estas dos funciones de conveniencia ya definidas en el módulo de subproceso:

# Their arguments are the same as the Popen constructor
retcode = subprocess.call(["echo", "2"])
subprocess.check_call(["echo", "2"])

Recuerde que puede redireccionar stdout y / o stderr a PIPE , y por lo tanto no se imprimirá en la pantalla (pero La salida aún está disponible para su lectura por su programa de Python). De forma predeterminada, stdout y stderr son Ninguno , lo que significa sin redirección , lo que significa que usarán el mismo stdout / stderr como su programa python.

Además, puede usar shell = True y redireccionar stdout . stderr a un PIPE, y por lo tanto no se imprimirá ningún mensaje:

# This will work fine, but no output will be printed
p = subprocess.Popen("echo 2", shell=True,
    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# This will NOT raise an exception, and the shell error message is redirected to PIPE
p = subprocess.Popen("echa 2", shell=True,
    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top