问题:子流程Popen和call有什么区别(我该如何使用它们)?
我想从Python调用一个外部程序。我已经使用过Popen()并且call()做到了。
两者有什么区别?
我的特定目标是从Python运行以下命令。我不确定重定向如何工作。
./my_script.sh > output
我阅读了文档,并说它call()是便利功能或快捷功能。我们使用call()代替会失去任何功能Popen()吗?
回答 0
重定向有两种方法。两者都适用于subprocess.Popen或subprocess.call。
设置关键字参数
shell = True或executable = /path/to/the/shell并在那里指定命令。由于您只是将输出重定向到文件,因此请设置关键字参数
stdout = an_open_writeable_file_object对象指向
output文件的位置。
subprocess.Popen比subprocess.call。
Popen不会阻塞,允许您在进程运行时与之进行交互,或者继续进行Python程序中的其他操作。调用Popen返回一个Popen对象。
call 会阻止。它支持与Popen构造函数相同的所有参数,因此您仍可以设置进程的输出,环境变量等,脚本将等待程序完成,并call返回表示进程退出状态的代码。
returncode = call(*args, **kwargs)
与通话基本相同
returncode = Popen(*args, **kwargs).wait()
call只是一种便利功能。它在CPython的实现是在subprocess.py:
def call(*popenargs, timeout=None, **kwargs):
"""Run command with arguments. Wait for command to complete or
timeout, then return the returncode attribute.
The arguments are the same as for the Popen constructor. Example:
retcode = call(["ls", "-l"])
"""
with Popen(*popenargs, **kwargs) as p:
try:
return p.wait(timeout=timeout)
except:
p.kill()
p.wait()
raise
如您所见,它周围是薄薄的包装纸Popen。
回答 1
另一个答案很完整,但这是一个经验法则:
call正在阻止:call('notepad.exe') print('hello') # only executed when notepad is closedPopen是非阻塞的:Popen('notepad.exe') print('hello') # immediately executed
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
