2016-12-22 17 views
1

メイン・スクリプトは、データのstdoutを継続的にチェックする新しいサブプロセスとスレッドで2番目のスクリプトを開始します。 2番目のスクリプトは入力を求めます。最初のスクリプトにユーザー入力を求めてから、2番目のスクリプトに渡したいと思います。私は窓で開発しているし、pexpectを動かすことができませんでした。スレッド・サブプロセスから別のスレッド・サブプロセスへの入力を送信

test.py - メインスクリプト

import threading 
import subprocess 

def read_output(process): 
    print("starting to read") 
    for line in process.stdout: 
     print (line.rstrip()) 

def write_output(process,s): 
    process.stdin.write(s.encode('utf-8')) 
    process.stdin.flush() 

process = subprocess.Popen('python test2.py', shell=False, 
          stdin=subprocess.PIPE, stdout=subprocess.PIPE, 
          stderr=None) 

# Create new threads 
thread1 = threading.Thread(read_output(process)) 

# Start new Threads 
thread1.daemon=True 
thread1.start() 

s=input("test input:") 
print("yep:"+s) 
thread1.process.stdin.write(s.encode('utf-8')) 
thread1.process.stdin.flush() 

test2.py 2番目のスクリプト

print("Enter an input A,B,C:") 

s=input("") 
print("you selected:"+s) 

答えて

1

まず間違い:間違った引数のスレッドを作成します。メインプロセスで呼び出された関数の結果を渡しています。スレッドはまだ開始されていません。開始されたスレッドではなくメインスレッドで出力を読み込みます。

このようにそれを修正:

thread1 = threading.Thread(target=read_output,args=(process,)) 

セカンド間違い(または多分プログラムが続いていること)、あなたはそれに文字列を書き込んだ後、プロセス標準入力を閉じる必要があります。

process.stdin.close() 

固定test1.pyファイル:

import threading 
import subprocess 

def read_output(process): 
    print("starting to read") 
    for line in process.stdout: 
     print (line.rstrip()) 


process = subprocess.Popen('python test2.py', shell=False, 
          stdin=subprocess.PIPE, stdout=subprocess.PIPE, 
          stderr=None) 

# Create new thread: pass target and argument 
thread1 = threading.Thread(target=read_output,args=(process,)) 

# Start new Threads 
thread1.daemon=True 
thread1.start() 

s=input("test input:") 
print("yep:"+s) 

process.stdin.write(s.encode('utf-8')) 
process.stdin.write("\r\n".encode('utf-8')) # emulate "ENTER" in thread 
process.stdin.close() # close standard input or thread doesn't terminate 
thread1.join() # wait for thread to finish 
+0

問題を修正し、成功のための正しい軌道に乗せてくれてありがとうございました!私が間違っていても、標準入力が開いていても問題ない場合は、文字列sendはキャプチャされた入力で\ r \ n文字を送信しないということです。別の行 'process.stdin.write(" \ r \ n ".encode( 'utf-8'))を追加すると、すべてが期待どおりに動作し、追加書き込みのために標準入力が開いたままになります。または、それを閉じると簡単に標準入力を再開できますか? – kaminsknator

+0

あなたは正しいです。すぐに終了しない場合は、CR + LFを送信する必要があります(これは、スレッドパラメータの問題が表示されなかったときに最初に試したものです)。入力を閉じるとプログラムをもう一度開くことはできませんので、プログラムを終了した時点です。 –

+0

私は頭がおかしくなったことを明確にしてくれてありがとうと思う。 args =(process、)のプロセスの後のカンマは何ですか? – kaminsknator

関連する問題