【问题标题】:Subprocess module errors with 'export' in python on linux?linux上python中的“export”子进程模块错误?
【发布时间】:2010-10-14 01:06:57
【问题描述】:

我正在设置一个程序来将我的计算机连接到我们学校的代理,目前有这样的东西:

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

请问大家为什么会这样?

【问题讨论】:

    标签: python subprocess


    【解决方案1】:

    问题在于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], ...])

    【讨论】:

      【解决方案2】:

      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()。

      【讨论】:

        猜你喜欢
        • 2014-06-30
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 1970-01-01
        • 2019-10-16
        • 2016-06-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多