2010-10-14 33 views
8

我設置了一個程序,我的電腦連接到我們學校的代理,目前有這樣的事情:在linux上的python中的'導出'的子進程模塊錯誤?

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) 

但是一旦運行,我得到:

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 

這是怎麼回事,請人?

回答

6

問題是export不是一個實際的命令或文件。它是一個內置的命令,如bashsh這樣的shell,所以當你嘗試subprocess.Popen時,你會得到一個異常,因爲它找不到export命令。默認情況下,Popen會執行os.execvp()以生成一個新進程,該進程不允許使用shell內部函數。

你可以這樣做,但你必須改變你的電話Popen

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

您可以指定shell=True,使之使用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)

在Unix,殼=真:如果ARGS是一個字符串,它指定了命令串通過殼來執行。這意味着該字符串的格式必須與在shell提示符下鍵入時的格式完全相同。這包括,例如,在其中包含空格的引號或反斜線轉義文件名。如果args是一個序列,則第一項指定命令字符串,並且任何附加項都將被視爲shell本身的附加參數。也就是說,POPEN不等價的:

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

3

export是不是你的系統上的一個單獨的二進制,它實際上是外殼本身只是一個命令。例如,嘗試在系統上使用which rm。你可能會看到類似的東西:

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

現在嘗試使用which export。你會得到這樣的:

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

所以你不能真正默認調用export進程/子進程。您可能想要看看os.putenv()os.environ()