2016-09-26 93 views
0

程序正在尝试读取图像,然后尝试将图像传递给子进程以进行进一步预处理。我正在尝试使用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我正在处理图像,然后试图回到它返回到主过程。

,目前的实现给了一个错误: 文件名或扩展名是太长

所以如何从主进程这一形象传递给子进程,也是我怎么能发回的图像回从子流程到主流程?

+0

既然'test1.py'是一个python脚本,为什么要用'subprocess'调用它呢?为什么不直接导入并使用它的功能? (如果它当前没有写成可以直接使用它的函数/类,那么它应该被重写。) – John1024

+0

@ john1024其实问题是我们在这两个文件中使用不同版本的库,因此我尝试创建一个子进程。 – kkk

+1

通过其他方式传递图像会更好 - 可能是临时文件,而不是套接字,管道而不是进程参数。 – SuperSaiyan

回答

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,该程序读取标准输入的IMG数据(需要将其转换为BytesIO),写IMG数据(保存到BytesIO)在处理完stdout之后。

相关问题