如何将图像传递给python中的子进程
问题描述:
程序正在尝试读取图像,然后尝试将图像传递给子进程以进行进一步预处理。我正在尝试使用subprocess args参数传递图像。如何将图像传递给python中的子进程
import subprocess
import base64
img =[]
img.append(base64.b64encode(open('test.jpg', "rb").read()))
output = subprocess.check_output(['python', 'test1.py',img])
print "output",output
在图像被传递到test1.py代码,在test1.py我正在处理图像,然后试图回到它返回到主过程。
,目前的实现给了一个错误: 文件名或扩展名是太长
所以如何从主进程这一形象传递给子进程,也是我怎么能发回的图像回从子流程到主流程?
答
我用做它subprocess.Popen
:
这是我的目录结构:
.
├── main.py
├── src.jpg
└── test1.py
在下面的代码,我改变src.jpg的大小,并将其保存为一个新文件称为src.thumbnail
。
这是main.py
。在main.py
我打开两个文件作为输入流(原始图片的流)和输出流(目标图片的流)。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import subprocess
def main():
# args are python interpreter and python file
args = ["/home/yundongx/.virtualenvs/read/bin/python", "/tmp/img/test1.py"]
with open("src.thumbnail", "w+b") as outstream, \
open("src.jpg", "rb") as instream:
ps = subprocess.Popen(args, stdin=instream, stdout=outstream)
ps.wait()
if __name__ == '__main__':
main()
这是test1.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from PIL import Image
import sys
import io
size = (128, 128)
def main():
try:
im = Image.open(io.BytesIO(sys.stdin.buffer.read()))
im.thumbnail(size)
output = io.BytesIO()
im.save(output, "JPEG")
sys.stdout.buffer.write(output.getvalue())
except IOError as e:
sys.stderr.write("Cannot read the data\n")
raise e
if __name__ == '__main__':
main()
在test1.py
,该程序读取标准输入的IMG数据(需要将其转换为BytesIO),写IMG数据(保存到BytesIO)在处理完stdout之后。
既然'test1.py'是一个python脚本,为什么要用'subprocess'调用它呢?为什么不直接导入并使用它的功能? (如果它当前没有写成可以直接使用它的函数/类,那么它应该被重写。) – John1024
@ john1024其实问题是我们在这两个文件中使用不同版本的库,因此我尝试创建一个子进程。 – kkk
通过其他方式传递图像会更好 - 可能是临时文件,而不是套接字,管道而不是进程参数。 – SuperSaiyan