【发布时间】:2011-03-11 11:46:45
【问题描述】:
我正在使用subprocess 模块调用不同的进程。不过,我有一个问题。
在以下代码中:
callProcess = subprocess.Popen(['ls', '-l'], shell=True)
和
callProcess = subprocess.Popen(['ls', '-l']) # without shell
两者都有效。阅读文档后,我知道shell=True 表示通过shell 执行代码。这意味着在缺席的情况下,直接启动该过程。
那么对于我的情况,我应该更喜欢什么 - 我需要运行一个进程并获取它的输出。从 shell 内部或外部调用它有什么好处。
【问题讨论】:
-
第一个命令不正确:
-l被传递给/bin/sh(shell)而不是ls程序on Unix ifshell=True。在大多数情况下,字符串参数应与shell=True一起使用,而不是列表。 -
re "进程直接启动": Wut?
-
声明“两者都有效”。关于这两个电话是不正确和误导的。调用的工作方式不同。只是从
shell=True切换到False,反之亦然是错误的。来自docs:“在 shell=True 的 POSIX 上,(...) 如果 args 是一个序列,则第一项指定命令字符串,并且任何附加项都将被视为 shell 本身的附加参数。”。在 Windows 上,有 automatic conversion,这可能是不受欢迎的。 -
有用的说明:你可以提供一个列表来调用/Popen,但它会默默地忽略除了列表的第一项之外的所有内容。 Python 3.5/Linux。
标签: python subprocess