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创建的子进程通过标准输入输出来实现与父进程的通信,这会导致各种意想不到的问题。所以我觉得可以尽量不用标准输入输出进行通信。

浙公网安备 33010602011771号