我正在设置一个程序将我的电脑连接到我们的学校代理,目前有类似的东西:
import subprocess
import sys
username = 'fergus.barker'
password = '*************'
proxy = 'proxy.det.nsw.edu.au:8080'
options = '%s:%s@%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
为什么会这样呢?
答案 0 :(得分:7)
问题是export
不是实际的命令或文件。它是bash
和sh
等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上,shell = True:如果args是一个字符串,它指定要通过shell执行的命令字符串。这意味着字符串的格式必须与在shell提示符下键入时完全相同。这包括,例如,引用或反斜杠转义带有空格的文件名。如果args是一个序列,则第一个项指定命令字符串,并且任何其他项将被视为shell本身的附加参数。也就是说,Popen相当于:
Popen(['/bin/sh', '-c', args[0], args[1], ...])
答案 1 :(得分:3)
export
不是系统中的单独二进制文件,它实际上只是shell本身的一个命令。例如,尝试在系统上使用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()
。