What is the difference between subprocess.popen and subprocess.run

我是 subprocess模块的新手,文档让我想知道 subprocess.popensubprocess.run之间有什么不同。命令的作用有什么不同吗?只是更新吗?用哪个更好?

77221 次浏览

subprocess.run() was added in Python 3.5作为相对于 subprocess.Popen的一种简化,当您只想执行一个命令并等待它完成,但同时不想做任何其他事情时。对于其他情况,您仍然需要使用 subprocess.Popen

主要的区别在于,subprocess.run()执行一个命令,而 等待完成它,而与 subprocess.Popen,你可以继续做你的东西,而进程完成,然后只是重复调用 Popen.communicate()自己传递和接收数据到您的进程。其次,subprocess.run()返回 subprocess.CompletedProcess

subprocess.run()只是包装了 PopenPopen.communicate(),所以你不需要做一个循环来传递/接收数据或者等待过程结束。

检查 官方文件了解哪些参数 subprocess.run()传递给 Popencommunicate()

默认情况下,两者都在 Python 中可用。

调用子流程的推荐方法是对它能够处理的所有用例使用 run ()函数。对于更高级的用例,可以直接使用底层的 Popen 接口。

- Subprocess.run :

import subprocess
import sys


result = subprocess.run([sys.executable, "-c", "print('ocean')"])

-Subprocess.popen: run multiple command line with subprocess, communicate method waits for the process to finish and finally prints the stdout and stderr as a tuple

例如:

import subprocess
process = subprocess.Popen(shell_cmd,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE,
text = True,
shell = True
)
std_out, std_err = process.communicate()
std_out.strip(), std_err