2

Python 3.5 引入了模块中的run()函数subprocess作为新推荐的高级子进程调用方法。

在三个较旧的(自 Python 2.5 / 2.7 起可用)高级 API 函数中,check_call(). Python 3.5 文档声称check_call()

[...] 相当于:

run(..., check=True)

该文档还警告不要传递subprocess.PIPEasstdoutstderrto check_call()

笔记

请勿使用stdout=PIPEstderr=PIPE与此功能一起使用。如果子进程生成足够的输出到管道以填满操作系统管道缓冲区,则子进程将阻塞,因为管道没有被读取。

由于它是“等效的”,因此此警告是否也适用于run(..., check=True),即应该

subprocess.run(..., stdout=subprocess.PIPE, check=True)

subprocess.run(..., stderr=subprocess.PIPE, check=True)

也要避免吗?(的文档run()没有提到这个警告。)

4

1 回答 1

9

将 check=True 与 stdout=PIPE 结合使用是否安全?

是的。

不应将stdout=PIPE其用作subprocess.check_call(或subprocess.call)参数的原因是这些实用程序函数不处理进程可能接收/产生的任何输入和输出。如果您希望处理输出,则需要(在subprocess.run实现之前)使用subprocess.check_output,它专门处理输出,在其自己的文档中,它声明等效于run(..., check=True, stdout=PIPE).stdout. 这清楚地表明这subprocess.run(...,check=True,stdout=PIPE)是有效的。

于 2015-10-22T19:58:07.517 回答