python的subprocess模块,用于在python程序运行过程中,开启多个子进程执行多个不同的脚本,并给不同的子进程指定不同的conda虚拟环境,并且主进程和子进程使用管道进行通信
python的subprocess模块,用于在python程序运行过程中,开启多个子进程执行多个不同的脚本,并给不同的子进程指定不同的conda虚拟环境,并且主进程和子进程使用管道进行通信。实例如下:
test.py:使用subprocess创建子进程并激活conda虚拟环境
import subprocess
import os
with open('image.jpg', 'rb') as f:
image_data = f.read()
env_variables = {
"PATH": "/home/ubuntu/softwares/anaconda3/envs/grpc/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin",
"PYTHONPATH": "/home/ubuntu/softwares/anaconda3/envs/grpc/lib/python3.9/site-packages",
"LD_LIBRARY_PATH": "/usr/local/lib",
"LANG": "en_US.UTF-8",
"LC_ALL": "en_US.UTF-8"
}
# 启动子进程
p = subprocess.Popen('python3 functionA.py', # 这里要写成Python3,不然如果env_variables环境不存在,就会导致自动使用python2而导致错误。
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
env= dict(os.environ, **env_variables),
shell=True)
# 向子进程传递图片数据并关闭标准输入
stdout_data, stderr_data = p.communicate(input=image_data)
# 处理结果数据
print(stdout_data)
functionA.py:
import sys
# import cv2
# 读取标准输入的二进制数据流
image_data = sys.stdin.buffer.read()
print("success\n")
# 从二进制数据中解码图片
# image_np = cv2.imdecode(np.frombuffer(image_data, dtype=np.uint8), cv2.IMREAD_COLOR)
# # 处理图片
# # ...
f = open('gg.jpg', 'wb')
f.write(image_data)
f.close()
# # 将结果二进制数据写入标准输出
sys.stdout.buffer.write(image_data)
sys.stdout.buffer.flush()
【注】functionA.py中所有的标准输出,包括print("success\n")
和sys.stdout.buffer.write(image_data)
都会返回到test.py中的stdout_data上。所以subprocess创建的子进程通过标准输入输出来实现与父进程的通信,这会导致各种意想不到的问题。所以我觉得可以尽量不用标准输入输出进行通信。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?