2016-08-09 11 views
1

私はPython用のIDEをPythonで作成していますが、サブプロセスを使用してユーザーのスクリプトと連携する必要があります。サブプロセスを使用してPythonスクリプトと対話する方法

私はサブプロセスの使用に全く新しいです、そして、私がここで何をしているのかよくわかりません。私は私が何をしようとしている表すテストスニペットを作成しました:

from subprocess import Popen,PIPE,STDOUT 
import tkinter as tk 

t=tk.Text() 
t.pack() 

p = Popen(["python","c:/runme.py"],stdout=PIPE,stdin=PIPE,stderr=PIPE,shell=True) 
p.stdin.write("5".encode()) 
out=p.stdout.read() 

t.insert(1.0,out) 

そして、ここでは、私はと対話しようとしているテストスクリプトです:

print("Hello World") 
inp=input("Enter a Number: ") 
print(inp) 
quit() 

残念ながらそれだけで、おそらく(待機中)を参照してください。すでに印刷されているものをどのように読み、文字列を入力するのですか?

import sys 
print("Hello World") 
print("Enter a Number: ") 
stdout.flush() 
inp = input() 
print(inp) 

、あなたがリターン\nで入力を終了する必要があります:スクリプトは、端末に接続されていない場合は、出力が自動的にフラッシュされていないため、

答えて

2

あなたは、定期的に標準出力をフラッシュする必要があり

p = Popen(["python", "c:/runme.py"], stdout=PIPE, stdin=PIPE, stderr=PIPE) 
p.stdin.write("5\n".encode()) 
out = p.stdout.read() 
+0

'stdout'は' sys'モジュールにあり、 'p.stdin'も' write() 'のあとにフラッシュする必要があります。私の答えの他のすべての部分はあなたのものと同じです:) – Cychih

2

shell=Trueを削除します。現在のところ、ではなく、pythonインタラクティブなインタープリタを起動するだけです。

問題はwhen you use shell=True the way in which the first argument is interpreted changes.shell=Trueが必要ではなく、入力した引数がshell=Falseバージョンの場合は正しいことです。

の違いを参照してください:あなたが気づくこととして

>>> import subprocess 
>>> subprocess.Popen(['python', 'whatever'], shell=True) 
<subprocess.Popen object at 0x7ff1bf933d30> 
>>> Python 2.7.12 (default, Jul 1 2016, 15:12:24) 
[GCC 5.4.0 20160609] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 
KeyboardInterrupt 
>>> 
KeyboardInterrupt 

立ち往生Pythonインタプリタを起動し、この:

whateverを実行しようと
>>> import subprocess 
>>> subprocess.Popen(['python', 'whatever']) 
<subprocess.Popen object at 0x7f14e1446cf8> 
>>> python: can't open file 'whatever': [Errno 2] No such file or directory 


また、あなたが代わりに読書のcommunicate方法を使用してへの直接書き込み/ stdin/stdoutから検討すべきです。

+0

私は 'shell = True'を削除し、読み込み前と書き込み後にフラッシュしました。今私の問題は、私は入力プロンプトが何であるかを読むことができない、私は読むことができる前に書く必要があるということです。ファイルが入力を待っている間に読み込む方法はありますか?そのファイルからユーザー入力をプロセスに "転送"する方法はありますか? –

+0

@HaydenR問題は、プロンプトが 'input'によってフラッシュされないことがあります。 'sys.stdout.write(プロンプト); sys.stdout.flush(); input()'で 'input(prompt)'を変更し、違いがあるかどうか確認してください。そうであれば、プロンプトをフラッシュする 'input'の周りに簡単なラッパーを書くべきです。 – Bakuriu

関連する問題