2016-09-26 2 views
0

プログラムはイメージを読み込み、さらに前処理のためにイメージをサブプロセスの1つに渡そうとしています。私はサブプロセスargsパラメータを使用して画像を渡そうとしています。画像はtest1.pyに渡されているコードでは イメージを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で私は、画像を操作して、メイン処理に戻ってそれを返すようにしようとしています。

現在の実装では、エラーを与えている: ファイル名または拡張子が

長すぎるので、どのように私は、メインプロセスからサブプロセスにこのイメージを渡すことができ、また、どのように私は戻って画像を送り返すことができますサブプロセスからメインプロセスへ?

+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では、入力ストリーム(元の画像のストリーム)と出力ストリーム(対象の画像のストリーム)として2つのファイルを開きます。

#!/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.pytest1.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() 

で、プログラムは(あなたがBytesIOに変換する必要があります)標準入力からのIMGのデータを読み、に保存(IMGデータを書き込みますBytesIO)を処理した後にstdoutに転送します。

関連する問題