在Linux上的python中使用'export'进行子进程模块错误?

时间:2010-10-14 01:06:57

标签: python subprocess

我正在设置一个程序将我的电脑连接到我们的学校代理,目前有类似的东西:

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 个答案:

答案 0 :(得分:7)

问题是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上,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()