程序正在尝试读取图像,然后尝试将图像传递给其中一个子进程以进行进一步的预处理。我试图使用subprocess args参数传递图像。
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中我正在操作图像,然后尝试将其返回到主进程。
当前的实现是错误的: 文件名或扩展名太长
那么如何将此图像从主进程传递到子进程以及如何将图像从子进程发送回主进程?
答案 0 :(得分:1)
我是通过使用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
中,程序从stdin中读取img数据(需要将其转换为BytesIO),在处理后将img数据(保存到BytesIO中)写入stdout。