2010-10-14 10 views
8

Ich gründe ein Programm bis zu meinem Computer zu unseren Schulen Proxy zu verbinden und haben zur Zeit so etwas wie dieses:Subprozessmodul Fehler mit 'Export' in Python unter 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) 

Aber bei Laufen bekomme ich:

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 

Warum ist das passiert bitte Jungs ?

Antwort

6

Das Problem ist, dass export kein tatsächlicher Befehl oder Datei ist. Es ist ein integrierter Befehl für Shells wie bash und sh. Wenn Sie also eine subprocess.Popen versuchen, erhalten Sie eine Ausnahme, weil der Befehl export nicht gefunden werden kann. Standardmäßig erzeugt Popen einen os.execvp(), um einen neuen Prozess zu erzeugen, der es nicht erlaubt, Shell-Intrinsics zu verwenden.

Sie können so etwas tun, obwohl Sie Ihren Anruf zu Popen ändern müssen.

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

können Sie shell=True angeben, um es Shell-Befehle verwenden zu machen.

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)

Unter Unix mit shell = True: args Wenn ein String ist, gibt es die Befehlsfolge durch die Schale auszuführen. Dies bedeutet, dass die Zeichenfolge genau so formatiert werden muss, wie sie bei der Shell-Eingabeaufforderung eingegeben würde. Dies umfasst beispielsweise das Ausgeben von Dateinamen oder Leerzeichen mit Leerzeichen in ihnen. Wenn args eine Sequenz ist, gibt das erste Element die Befehlszeichenfolge an, und alle zusätzlichen Elemente werden als zusätzliche Argumente für die Shell selbst behandelt. Das heißt, Popen tut das Äquivalent von:

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

3

export ist keine separate binäre auf Ihrem System, es ist eigentlich nur ein Befehl in der Shell selbst. Versuchen Sie beispielsweise, which rm auf Ihrem System zu verwenden.

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

Jetzt versuchen which export mit: Sie werden wahrscheinlich so etwas wie sehen. Sie werden so etwas wie erhalten:

[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) 

So können Sie nicht wirklich ein export Prozess/Subprozess standardmäßig aufrufen. Vielleicht möchten Sie stattdessen und os.environ() betrachten.

Verwandte Themen