You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Subprocess.Popen无法获取子进程return值的问题

解决方法

要获取子脚本中函数的return值,需要分两步修改:

1. 修改子脚本,将return值转为进程退出码

Python脚本的进程退出码默认是0(正常结束),函数的return值不会自动成为进程退出码。需要用sys.exit()把函数返回值设置为进程的退出码:

import sys

def func():
    print(1 + 1)
    return 2

if __name__ == "__main__":
    func_result = func()
    sys.exit(func_result)

2. 修改主程序,获取进程退出码并传递

主程序需要修正两处问题:

  • 原代码中process.Wait()是错误写法,应为小写的process.wait()
  • 在进程结束后获取returncode,并将其加入输出队列,最后在get_output中分离输出内容和返回值

修改后的SubprocessThread类代码:

import subprocess
import threading
from queue import Queue

class SubprocessThread(threading.Thread):
    def __init__(self, command, output_queue):
        super().__init__()
        self.command = command
        self.output_queue = output_queue

    def run(self):
        process = subprocess.Popen(
            self.command,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )

        # 读取标准输出
        for line in process.stdout:
            self.output_queue.put(line.strip().decode())

        # 读取标准错误
        for line in process.stderr:
            self.output_queue.put(line.strip().decode())

        # 等待进程结束,获取退出码
        process.wait()
        return_code = process.returncode

        # 先放入退出码,再放入None标识结束
        self.output_queue.put(return_code)
        self.output_queue.put(None)

    def get_output(self):
        results = []
        while True:
            result = self.output_queue.get()
            if result is None:
                break
            results.append(result)
        # 结果列表最后一个元素是退出码,前面是输出内容
        return results[:-1], results[-1]

原理说明

  • 子脚本通过sys.exit(n)设置进程的退出码n,父进程可以通过subprocess.Popen对象的returncode属性获取这个值
  • 主程序将退出码加入输出队列,和标准输出/错误一起传递,最后在get_output中分离出输出内容和返回值

内容的提问来源于stack exchange,提问作者Shepard Merose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 19:28:20