###環境
python3.8.1
OS : Windows10
###実現しようとしたこと
pythonの標準ライブラリであるsubprocessモジュールを使用し、プロセスを生成したのちに
値を渡し、渡された値に応じてプロセスが適切な結果を返すことを確認しようとしておりました。
プロセスを生成する側のコード(test.py)と実行されるプロセスのコード(process_router.py)
は以下の通りです。
python
1#test.py 2class CallProcessRouter(): 3 4 def __init__(self): 5 self.BASEDIR = os.path.abspath( os.path.dirname( __file__ ) ) 6 #サブプロセスを開く 7 cmd = ['python', self.BASEDIR+'/../src/process_router.py'] 8 self.proc = subprocess.Popen(cmd, 9 stdin=subprocess.PIPE, 10 stdout=subprocess.PIPE, 11 stderr=subprocess.PIPE 12 ) 13 14 def drive_process_router(self, arg): 15 self.proc.stdin.write(arg.encode()) 16 self.proc.stdin.write('\n'.encode()) 17 self.proc.stdin.flush() 18 output = self.proc.stdout.readline().strip() 19 stderr = self.proc.stderr.readline().strip() 20 21if __name__=="__main__": 22 a = CallProcessRouter() 23 path = "~\xxx.json" #json file path 24 a.drive_process_router(path)
python
1#process_router.py 2while True: 3 try: 4 param = sys.stdin.readline().strip() 5 if param == '': 6 break 7 #中略 8 #処理した結果の出力 9 output = {"result" : True} 10 output_str = json.dumps(output) 11 print(output_str) 12 except: 13 #When error occured, process_router.py send error message as json normal output. 14 output = {"result":False, 15 "data":{ 16 "error_message":traceback.format_exc(), 17 } 18 } 19 print(json.dumps(output))
###問題点
test.pyを実行したところ、process_router.pyには繋がるのですが、
print文で出力した結果がtest.pyのstdout.readline().strip()で
受け取れていないようなのです。
process_router.pyは親プロセスによってkillされない限り動き続けるため、
値を受け取れないとそこで処理がブロックされ、いつまでも処理が終わらない状態と
なります。
###試したこと
- readline()による入力は\nで区切られるため、print出力を行うoutput_strに
直接\nを付加したのですが結果は変わりませんでした。
- subprocess.Popenの出力がバイナリになっている可能性を踏まえ
output = self.proc.stdout.readline().decode().strip()
と変更したのですが上手く値を受け取ることが出来ませんでした。
- process生成時のコマンドを
cmd = 'python '+self.BASEDIR+'/../src/process_router.py'
に変更したところ、何故か次のエラーを吐きました。原因はわかっておりません。
File "test.py", line 56, in drive_process_router self.proc.stdin.flush() OSError: [Errno 22] Invalid argument
- Linux(Amazon Linux)環境下でも実行しましたが、Windowsと同じ状況でした。
どのような意見でもよいので、ご教授よろしくお願いします。

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/13 11:28
2020/06/03 07:19 編集