使用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
相关产品推荐
相关产品推荐

