2

如果我在 Windows 上执行以下 python 代码:

import subprocess
subprocess.Popen( [ 'python', 'foo' ], shell = True ).communicate()

正如预期的那样,我将错误写入标准输出:

python: can't open file 'foo': [Errno 2] No such file or directory

但是如果我在 linux (ubuntu, OSX - any) 上执行相同的代码,我会启动交互式 python REPL 而不是这个文本!像这样:

user@debian:~/Documents$ python test.py
Python 2.7.3 (default, Jab 2 2013, 16:53:07)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information
>>>

为什么会有这种奇怪的行为?使用参数 ('foo') 执行 python 解释器必须在所有平台上将其置于评估模式,而不是进入 REPL 模式。

4

1 回答 1

7

这在文档中有详细说明:

shell 参数(默认为 False)指定是否使用 shell 作为程序来执行。如果 shell 为 True,建议将 args 作为字符串而不是序列传递。

在带有 shell=True 的 Unix 上,shell 默认为 /bin/sh。如果 args 是字符串,则该字符串指定要通过 shell 执行的命令。这意味着字符串的格式必须与在 shell 提示符下键入时的格式完全相同。这包括,例如,引用或反斜杠转义文件名,其中包含空格。如果 args 是一个序列,则第一项指定命令 string,并且任何附加项都将被视为 shell 本身的附加参数。

(强调我的)

于 2013-05-30T15:50:38.523 回答