【发布时间】:2015-11-28 15:38:58
【问题描述】:
我已经查看了他们两个的文档。
J.F. 在这里的评论提示了这个问题:Retrieving the output of subprocess.call()
subprocess.call() 的当前 Python 文档对使用 PIPE 为 subprocess.call() 进行了以下说明:
注意不要在此函数中使用
stdout=PIPE或stderr=PIPE。如果子进程生成足够的输出到管道以填满操作系统管道缓冲区,则子进程将阻塞,因为管道没有被读取。
Python 2.7 subprocess.call():
注意不要将
stdout=PIPE或stderr=PIPE与此功能一起使用,因为这可能会根据子进程输出量而死锁。当您需要管道时,将 Popen 与communicate() 方法一起使用。
Python 2.6 不包含此类警告。
另外,subprocess.call() and subprocess.check_call() 似乎没有办法访问他们的输出,除了使用 stdout=PIPE 和通信():
https://docs.python.org/2.6/library/subprocess.html#convenience-functions
注意,如果要向进程的
stdin发送数据,则需要使用stdin=PIPE创建Popen对象。同样,要在结果元组中获得 None 以外的任何内容,您也需要提供stdout=PIPE和/或stderr=PIPE。
https://docs.python.org/2.6/library/subprocess.html#subprocess.Popen.communicate
subprocess.call() 和 subprocess.Popen() 之间有什么区别使PIPE 对subprocess.call() 的安全性降低?
更具体:为什么subprocess.call()“死锁基于子进程输出量。”,而不是Popen()?
【问题讨论】:
-
// ,后续问题:Python 2 和 Python 3 之间的这种差异有何变化?
-
你为什么总是用
//开始一切? -
@chepner:嗯,按钮确实说“添加评论”.... :)
-
// , Meta 的后续问题:为什么很少有人对 SO 有幽默感?
-
# @NathanBasanese 也许我是 completely missing the point,但 Python 的注释符号是
#,这与 C++、PHP 和 JavaScript 不同。
标签: python python-2.7 subprocess popen python-2.6