2010-10-14 9 views
8

Soy la creación de un programa para conectar el ordenador a nuestro proxy de las escuelas y en la actualidad tener algo como esto:Errores del módulo de subproceso con 'export' en python en Linux?

import subprocess 
import sys 

username = 'fergus.barker' 
password = '*************' 
proxy = 'proxy.det.nsw.edu.au:8080' 
options = '%s:%[email protected]%s' % (username, password, proxy) 

subprocess.Popen('export http_proxy=' + options) 

Pero durante la marcha me sale:

Traceback (most recent call last): 
File "school_proxy_settings.py", line 19, in <module> 
subprocess.Popen('export http_proxy=' + options) 
File "/usr/lib/python2.6/subprocess.py", line 621, in __init__ 
errread, errwrite) 
File "/usr/lib/python2.6/subprocess.py", line 1126, in _execute_child 
raise child_exception 
OSError: [Errno 2] No such file or directory 

por qué sucede esto por favor chicos ?

Respuesta

6

El problema es que export no es un comando o archivo real. Es un comando integrado para shells como bash y sh, por lo que cuando intente con subprocess.Popen obtendrá una excepción porque no puede encontrar el comando export. De forma predeterminada, Popen hace un os.execvp() para generar un nuevo proceso, que no le permitiría usar intrínsecos de shell.

Puede hacer algo como esto, aunque debe cambiar su llamada al Popen.

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

Puede especificar shell=True a hacer que use los comandos de shell.

class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

En Unix, con la cáscara = True: Si args es una cadena, se especifica la cadena de comandos para ejecutar a través de la cáscara. Esto significa que la cadena se debe formatear exactamente como lo sería cuando se escribe en el indicador del intérprete de comandos. Esto incluye, por ejemplo, citas o barras invertidas que escapan nombres de archivos con espacios en ellas. Si args es una secuencia, el primer elemento especifica la cadena de comandos, y cualquier elemento adicional se tratará como argumentos adicionales para el propio shell. Es decir, Popen hace el equivalente de:

Popen(['/bin/sh', '-c', args[0], args[1], ...])

3

export no es un binario independiente en el sistema, es en realidad sólo un comando dentro del propio depósito. Por ejemplo, intente usar which rm en su sistema. Probablemente verá algo como:

[21:16:28] ~ $ which rm 
/bin/rm 

Ahora trate de usar which export. Usted obtendrá algo como:

[21:16:37] ~ $ which export 
/usr/bin/which: no export in (/usr/lib/qt-3.3/bin:/usr/kerberos/sbin: 
/usr/kerberos/bin:/usr/lib/ccache:/usr/local/bin:/usr/bin:/bin: 
/usr/local/sbin:/usr/sbin:/sbin:/home/carter/bin) 

Así realidad no se puede invocar una export proceso/subproceso de forma predeterminada. Es posible que desee mirar os.putenv() y os.environ() en su lugar.

Cuestiones relacionadas