2010-10-14 9 views
8

mam konfigurowania programu do podłączenia komputera do naszego pełnomocnika szkołach i mają obecnie mniej więcej tak:Błędy modułu podprocesowego z "eksportem" w pythonie na linuxie?

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) 

Ale po biegu uzyskać:

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 

Dlaczego tak się dzieje proszę faceci ?

Odpowiedz

6

Problem polega na tym, że export nie jest faktycznym poleceniem lub plikiem. Jest to wbudowane polecenie do powłok takich jak bash i sh, więc gdy spróbujesz subprocess.Popen otrzymasz wyjątek, ponieważ nie może znaleźć polecenia export. Domyślnie Popen wykonuje os.execvp(), aby utworzyć nowy proces, który nie pozwoliłby na użycie wewnętrznego elementu powłoki.

Możesz zrobić coś takiego, chociaż musisz zmienić połączenie na Popen.

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

Można określić shell=True aby używać poleceń powłoki.

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)

Na Unix, z powłoką = True: Jeżeli args jest ciągiem znaków, określa ciąg poleceń do wykonania przez powłokę. Oznacza to, że ciąg musi być sformatowany dokładnie tak, jak gdyby był wpisany w wierszu poleceń powłoki. Obejmuje to, na przykład, cytowanie lub ukośnik odwrotny, wymuszanie nazw plików z spacji w nich. Jeśli argumentem jest sekwencja, pierwszy element określa ciąg poleceń, a wszelkie dodatkowe elementy będą traktowane jako dodatkowe argumenty do samej powłoki. To znaczy, Popen robi równowartość:

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

3

export nie jest oddzielnym binarnego w systemie, to jest rzeczywiście tylko komenda w samej powłoki. Na przykład spróbuj użyć which rm w systemie. Prawdopodobnie zobaczysz coś takiego:

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

Teraz spróbuj użyć which export. Dostaniesz coś takiego:

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

Nie można więc rzeczywiście wywołania export procesów/podprocesów domyślnie. Możesz zamiast tego spojrzeć na os.putenv() i os.environ().

Powiązane problemy