Python在Linux上使用subprocess模块时,'export'出现错误?

13 投票
2 回答
10614 浏览
提问于 2025-04-16 05:27

我正在设置一个程序,把我的电脑连接到我们学校的代理服务器,目前的代码大概是这样的:

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 个回答

6

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() 这两个东西。

12

问题在于,export 不是一个真正的命令或文件。它是像 bashsh 这样的命令行工具内置的一个命令,所以当你尝试使用 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], ...])

撰写回答