2016-09-26 3 views
0

프로그램이 이미지를 읽은 다음 추가 사전 처리를 위해 이미지를 서브 프로세스 중 하나에 전달하려고합니다. 하위 프로세스 args 매개 변수를 사용하여 이미지를 전달하려고합니다. 이미지가 test1.py에 전달되는 코드에서 이미지를 파이썬의 서브 프로세스에 전달하는 방법

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에서 나는 이미지를 조작하고 주요 공정에 다시 복귀하려합니다. 파일명 또는 확장자 나 이미지를 다시 되돌려 보낼 수 있는지 그래서

이 방법은 또한 서브 프로세스를 메인 프로세스에서이 이미지를 전달할 수 있으며, 너무 길면 :

현재 구현 오류주고 하위 프로세스에서 주 프로세스로?

+0

'test1.py'는 파이썬 스크립트이므로'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에서 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() 

이며,이 프로그램에 저장합니다 (IMG 데이터를 기록, (당신이 BytesIO로 변환 할 필요가) 표준 입력에서 IMG 데이터를 읽고 BytesIO)를 처리 한 후 표준 출력으로 보냅니다.

관련 문제