1

正如标题所说:

  1. subprocess模块不能使用,因为这应该适用于 2.4 和 2.5
  2. 不应生成 Shell 进程来传递参数。

为了解释 (2),请考虑以下代码:

>>> x=os.system('foo arg')
sh: foo: not found
>>> x=os.popen('foo arg')
sh: foo: not found
>>> 

如您所见os.systemos.popen通过系统外壳(“sh”)运行给定的命令(“foo”)。我不希望这种情况发生(否则,丑陋的“未找到”消息会在我无法控制的情况下打印到程序 stderr)。

最后,我应该能够将参数传递给这个程序(上例中的“arg”)。

在 Python 2.5 和 2.4 中如何做到这一点?

4

2 回答 2

3

您可能需要使用 Python 2.4 中可用的 subprocess 模块

Popen("/home/user/foo" + " arg")

>>> Popen("foo arg", shell=False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/subprocess.py", line 595, in __init__
    errread, errwrite)
  File "/usr/lib/python2.6/subprocess.py", line 1092, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

由于您没有使用 shell,因此您需要包含完整路径。

http://docs.python.org/library/subprocess.html#replacing-os-system

或者,您也可以将 subprocess.PIPE 传递给 stderr 和 stdout 以抑制消息。有关更多详细信息,请参阅上面的链接。

于 2009-09-10T22:11:33.247 回答
0

如前所述,您可以(并且应该)使用subprocess模块。

默认情况下,shell参数是False。这很好,也很安全。此外,您不需要传递完整路径,只需将可执行文件名称和参数作为序列(元组或列表)传递。

import subprocess

# This works fine
p = subprocess.Popen(["echo","2"])

# These will raise OSError exception:
p = subprocess.Popen("echo 2")
p = subprocess.Popen(["echo 2"])
p = subprocess.Popen(["echa", "2"])

您还可以使用已经在子流程模块中定义的这两个便利功能:

# Their arguments are the same as the Popen constructor
retcode = subprocess.call(["echo", "2"])
subprocess.check_call(["echo", "2"])

请记住,您可以重定向stdout和/或stderrPIPE,因此它不会打印到屏幕上(但输出仍然可供您的 python 程序读取)。默认情况下,stdoutand stderrare both None,这意味着没有重定向,这意味着它们将使用与您的 python 程序相同的 stdout/stderr。

此外,您可以使用shell=True和重定向stdout. stderr到 PIPE,因此不会打印任何消息:

# This will work fine, but no output will be printed
p = subprocess.Popen("echo 2", shell=True,
    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# This will NOT raise an exception, and the shell error message is redirected to PIPE
p = subprocess.Popen("echa 2", shell=True,
    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
于 2009-09-10T23:25:52.970 回答