2017-10-15 11 views
0

デコレートしたいpython.exe。例えば、それはすることができますちょうどInput:\n我々は対話モードでstdoutプレフィックスから読んだとき、我々はstdinOutput:\nに書き込むとき:サブプロセスを使用してCLIプログラムをデコレートする。

オリジナルpython.exe

$ python 
Python 3.6.1 |Anaconda custom (64-bit)| (default, Mar 22 2017, 20:11:04) [MSC v.1900 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> print(2) 
2 
>>> 2 + 2 
4 
>>> 

除外がpython.exeを飾ら

$ decorated_python 
Output: 
Python 3.6.1 |Anaconda custom (64-bit)| (default, Mar 22 2017, 20:11:04) [MSC v.1900 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 
Input: 
print(2) 
Output: 
2 
>>> 
Input: 
2 + 2 
Output: 
4 
>>> 

私はそれがこのようになるはずだと思います:

import subprocess 

pid = subprocess.Popen("python".split(), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

while True: 
    pid.stdin.write(input('Input:\n').encode()) 
    print('Output:\n' + pid.stdout.readlines()) 

しかし、pid.stdout.readlines()は実行されていません。

私もcommunicateメソッドを使用しようとしましたが、それは初回のみ動作します。

import subprocess 

pid = subprocess.Popen("python".split(), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

while True: 
    print('Output:\n', pid.communicate(input('Input:\n').encode())) 

テスト:

Input: 
print(1) 
Output: 
(b'1\r\n', b'') 
Input: 
pritn(1) 
Traceback (most recent call last): 
    File "C:/Users/adr-0/OneDrive/Projects/Python/AdrianD/temp/tmp.py", line 6, in <module> 
    print('Output:\n', pid.communicate(input('Input:\n').encode())) 
    File "C:\Users\adr-0\Anaconda3.6\lib\subprocess.py", line 811, in communicate 
    raise ValueError("Cannot send input after starting communication") 
ValueError: Cannot send input after starting communication 

私はpythonでちょうど2を置く場合、私がするので、たぶん私はちょうど、何かを欠場2を入手してください。

ピュアPython:communicate方法で飾ら

>>> 2 
2 

:あなたがPythonドキュメントを見れば

Input: 
2 
Output: 
(b'', b'') 

答えて

1

あなたが標準入力を使用するときにすることを見つけることができます。しかし、私はこの2communicateを持つメソッドを取得することはできません/ stdout = PIPEこれらのストリームでread/writeアクションを使用しないことはほとんどお勧めできません。デッドロックが発生する可能性があります.-実際にリードラインを実行中に経験したもの: https://docs.python.org/2/library/subprocess.html#popen-objects

次の問題が原因である

「Popen.communicate()が標準入力にデータの一回書き込みを行い、stdoutとstderrからデータを取得するためにスレッドを作成するヘルパーメソッドです。データの書き込みが終了するとstdinを閉じ、パイプが閉じるまでstdoutとstderrを読み込みます。子供はすでにそれが返された時間で終了しているので、あなたは、第二の通信を行うことができない「@tdelaney

より:。 Multiple inputs and outputs in python subprocess communicate

は、一般的にインタラクティブな子プロセスが難しいですやって、あなたが を使用しようとするかもしれませんhttps://pexpect.readthedocs.io/en/stable/

+0

お返事ありがとうございます。残念ながら、 'pexpect'はWindowsでは動作しません... – ADR

関連する問題