使用 Python 子进程通信方法时如何获取退出代码?

2025-03-05 09:14:00
admin
原创
88
摘要:问题描述:如何在使用 Python 的subprocess模块和communicate()方法时检索退出代码?相关代码:import subprocess as sp data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[...

问题描述:

如何在使用 Python 的subprocess模块和communicate()方法时检索退出代码?

相关代码:

import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]

我应该用其他方式来做这件事吗?


解决方案 1:

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).

因此您可以这样做(我没有测试过,但它应该可以工作):

import subprocess as sp
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
streamdata = child.communicate()[0]
rc = child.returncode

(*) 发生这种情况是因为它的实现方式:在设置线程来读取子流后,它只需调用wait

解决方案 2:

只是指出一个常见的误解,你应该Popen尽可能避免。引用文档,

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

如果您只想运行一个子进程并等待它完成,那么只需一行代码subprocess.run或其遗留的兄弟subprocess.callsubprocess.check_output,您不需要复制/粘贴和/或理解低级对象所需的communicate和等方法的复杂性。wait`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

如果您不想捕获来自该过程的输出,也许可以替换capture_output=Truestdout=subprocess.DEVNULL(或许也可以类似地替换为stderr);如果没有,则输出将仅显示给用户,而不受 Python 的控制。

此外,除非您的选择opts完全不重要,否则通常会用了解如何处理带引号的字符串的字符串替换split()这里的常规字符串。shlex.split()

解决方案 3:

.poll()将更新返回代码。

尝试

child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
returnCode = child.poll()

此外,.poll()调用之后,返回代码在对象中可用child.returncode

解决方案 4:

您首先应确保进程已完成运行,并且已使用该方法读取返回代码.wait。这将返回代码。如果您稍后想要访问它,它将存储在对象.returncodePopen

解决方案 5:

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)

解决方案 6:

exitcode = data.wait()如果子进程写入标准输出/错误,和/或从标准输入读取,并且没有对等进程,则子进程将被阻止。

解决方案 7:

这对我来说很有效。它还打印了子进程返回的输出

child = subprocess.Popen(serial_script_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    retValRunJobsSerialScript = 0
    for line in child.stdout.readlines():
        child.wait()
        print line           
    retValRunJobsSerialScript= child.returncode

解决方案 8:

请参阅评论。

代码:

import subprocess


class MyLibrary(object):

    def execute(self, cmd):
        return subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True,)
      
    def list(self):
        command = ["ping", "google.com"]
        sp = self.execute(command)
        status = sp.wait()  # will wait for sp to finish
        out, err = sp.communicate()
        print(out)
        return status # 0 is success else error


test = MyLibrary()

print(test.list())

输出:

C:UsersshitaDocumentsTechPython>python t5.py

Pinging google.com [142.250.64.78] with 32 bytes of data:
Reply from 142.250.64.78: bytes=32 time=108ms TTL=116
Reply from 142.250.64.78: bytes=32 time=224ms TTL=116
Reply from 142.250.64.78: bytes=32 time=84ms TTL=116
Reply from 142.250.64.78: bytes=32 time=139ms TTL=116

Ping statistics for 142.250.64.78:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 84ms, Maximum = 224ms, Average = 138ms

0
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3983  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2747  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   82  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   90  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   79  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用