我有一个包装了python脚本的可执行文件,也许很简单,如下所示:
# my_child_wrapper.sh
echo About to start the child
python my_child.py "$@"
echo Child finished
由于这个包装层,我无法使用multiprocessing.Process
中明显的API。
我想在孩子和父母之间建立一个多处理Pipe
。下面的幼稚方法行不通,因为Pipe
返回的对象不可腌制:
# my_parent.py
import multiprocessing
a, b = multiprocessing.Pipe()
def run_child():
subprocess.check_call(['my_child_wrapper.sh', pickle.dumps(b)])
Thread(target=run_child).start()
a.send('Some python object')
# my_child.py
import sys
import pickle
b = pickle.loads(sys.argv[1])
while True:
print(b.recv())
答案 0 :(得分:1)
您必须使用外壳包装代码吗?如果您可以在my_child.py
的{{1}}中显式调用python代码,那么它应该会更容易(即
基本上只是管道example)。
假设您无法执行此操作,则可以用类似的方式创建命名管道,但可以更明确地使用my_parent.py
并仅传递管道名称。
我必须在您的mkfifo
上添加一条shebang线,但以下是示例:
.sh
然后是子代码:
# my_parent.py
from threading import Thread
import os
import subprocess
pipename = 'mypipe'
try:
os.mkfifo(pipename)
except FileExistsError:
pass
# start child
def run_child():
subprocess.check_call(['/MYPATH/my_child_wrapper.sh', pipename])
Thread(target=run_child).start()
# send data
with open(pipename, 'wb') as p:
p.write(b'Something')
这是您所要求的内容的OS管道版本,很有趣,但不是您所要求的内容的简单解决方案。