Python 什么';子进程Popen和call之间的区别是什么(我如何使用它们)?
我想从Python调用一个外部程序。我使用了Python 什么';子进程Popen和call之间的区别是什么(我如何使用它们)?,python,subprocess,popen,Python,Subprocess,Popen,我想从Python调用一个外部程序。我使用了Popen()和call()来实现这一点 这两者有什么区别 我的具体目标是从Python运行以下命令。我不知道重定向是如何工作的 ./my_script.sh > output 我读到它说,call()是一个方便函数或快捷函数。如果使用call()而不是Popen(),我们会失去电源吗?有两种方法可以重定向。两者都适用于子流程.Popen或子流程.call 将关键字参数shell=True或executable=/path/to/the/she
Popen()
和call()
来实现这一点
这两者有什么区别
我的具体目标是从Python运行以下命令。我不知道重定向是如何工作的
./my_script.sh > output
我读到它说,
call()
是一个方便函数或快捷函数。如果使用call()
而不是Popen()
,我们会失去电源吗?有两种方法可以重定向。两者都适用于子流程.Popen
或子流程.call
shell=True
或executable=/path/to/the/shell
设置为/shell,并按原样指定命令stdout = an_open_writeable_file_object
其中对象指向输出
文件Popen
不会阻塞,允许您在进程运行时与进程交互,或者继续处理Python程序中的其他内容。调用Popen
返回一个Popen
对象
调用
不会阻塞。虽然它支持与Popen
构造函数相同的所有参数,因此您仍然可以设置进程的输出、环境变量等,但脚本将等待程序完成,并且call
返回表示进程退出状态的代码
returncode = call(*args, **kwargs)
基本上和打电话一样
returncode = Popen(*args, **kwargs).wait()
调用
只是一个方便的功能。它在CPython中的实现是:
如您所见,它是一个薄薄的包装,围绕着
Popen
另一个答案非常完整,但这里有一条经验法则:
被阻塞:呼叫
call('notepad.exe') print('hello') # only executed when notepad is closed
是非阻塞的:Popen
call('notepad.exe') print('hello') # only executed when notepad is closed
Popen('notepad.exe') print('hello') # immediately executed
call()
的定义似乎非常清楚。你能提供一个报价或链接让我们知道在回答中应该关注什么吗?基本上,Popen和call是分别用于运行Linux命令的异步和同步函数。使用Popen的优势是什么?“等到被调用的程序首先完成不是很安全吗?”汤姆经常这样。如果您想读取一些输出,然后向程序发送更多输入,读取该输入产生的更多输出,重复?@user3016020我想这也适用于Windows命令?是吗?@user3016020我不明白你的意思,你能详细解释一下吗?使用运行Linux命令..很好而且容易理解的解释。非常感谢。