Python在Linux上使用subprocess模块时,'export'出现错误?
我正在设置一个程序,把我的电脑连接到我们学校的代理服务器,目前的代码大概是这样的:
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
请问这是为什么呢?
2 个回答
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()
这两个东西。
问题在于,export
不是一个真正的命令或文件。它是像 bash
和 sh
这样的命令行工具内置的一个命令,所以当你尝试使用 subprocess.Popen
时,会出现异常,因为找不到 export
这个命令。默认情况下,Popen
会使用 os.execvp()
来启动一个新进程,这样就无法使用命令行的内置功能。
不过,你可以这样做,只是需要改变你调用 Popen
的方式。
http://docs.python.org/library/subprocess.html
你可以设置 shell=True
来使用命令行命令。
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
是一个字符串,它就指定了通过命令行执行的命令字符串。这意味着这个字符串必须和你在命令行提示符下输入时的格式完全一致。例如,如果文件名中有空格,就需要用引号或反斜杠来转义。如果args
是一个序列,第一个项目指定命令字符串,后面的项目将被视为传递给命令行的额外参数。也就是说,Popen
实际上做的相当于:
Popen(['/bin/sh', '-c', args[0], args[1], ...])