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

posted @   好人~  阅读(658)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示