Car*_*tem 172 python subprocess
使用Python的subprocess模块和communicate()方法时如何检索退出代码?
相关代码:
import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]
Run Code Online (Sandbox Code Playgroud)
我应该这样做吗?
Eli*_*sky 244
Popen.communicate将在returncode完成后设置属性(*).这是相关的文档部分:
Popen.returncode
The child return code, set by poll() and wait() (and indirectly by communicate()).
A None value indicates that the process hasn’t terminated yet.
A negative value -N indicates that the child was terminated by signal N (Unix only).
Run Code Online (Sandbox Code Playgroud)
所以你可以这样做(我没有测试它,但它应该工作):
import subprocess as sp
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
streamdata = child.communicate()[0]
rc = child.returncode
Run Code Online (Sandbox Code Playgroud)
(*)这是因为它的实现方式:在设置线程以读取子流后,它只是调用wait.
tri*_*eee 21
只是指出一个常见的误解,您应该Popen尽可能避免。引用文档,
如果您只想运行一个子进程并等待它完成,那么这是一行代码及其subprocess.run遗留兄弟subprocess.calland subprocess.check_output,并且您不需要复制/粘贴和/或了解所需的communicateandwait等方法的复杂性围绕低层Popen物体。
import subprocess
proc = subprocess.run(
[openRTSP] + opts.split(),
capture_output=True,
# avoid having to explicitly encode
text=True)
data = proc.stdout
result = proc.returncode
Run Code Online (Sandbox Code Playgroud)
如果您不想捕获该过程的输出,可以替换capture_output=True为stdout=subprocess.DEVNULL(对于 也可能类似stderr);如果两者都不存在,输出将简单地显示给用户,不受 Python 的控制。
另外,除非您的选项完全微不足道,否则通常将此处opts的常规字符串替换为了解如何处理带引号的字符串。split()shlex.split()
Mat*_*non 17
.poll() 将更新返回代码。
尝试
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
returnCode = child.poll()
Run Code Online (Sandbox Code Playgroud)
此外,在.poll()被调用之后,返回码在对象中可用child.returncode。
Jos*_*ush 13
process.wait()打电话后使用process.communicate()。
例如:
import subprocess
process = subprocess.Popen(['ipconfig', '/all'], stderr=subprocess.PIPE, stdout=subprocess.PIPE)
stdout, stderr = process.communicate()
exit_code = process.wait()
print(stdout, stderr, exit_code)
Run Code Online (Sandbox Code Playgroud)
您应首先确保该进程已完成运行,并且已使用该.wait方法读取了返回代码.这将返回代码.如果您想稍后访问它,它将存储.returncode在Popen对象中.
| 归档时间: |
|
| 查看次数: |
212583 次 |
| 最近记录: |