2016-08-09 2 views
1

Я пишу IDE для python на 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() 

К сожалению, он просто ждет (предположительно) в строке 2. Как я могу прочитать то, что уже было напечатано, и как мне затем ввести строку?

ответ

2

Вы должны очистить STDOUT регулярно, потому что, если сценарий не подключен к терминалу, выход автоматически не покраснел:

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

и вы должны прекратить ввод возвращением \n:

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 

Что, как вы можете заметить, запускает питона интерпретатор, который застревает, и это:

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

который пытается выполнить whatever.


Также следует рассмотреть возможность использования метода communicate вместо чтения и записи непосредственно в/из stdin/stdout.

+0

Я удалил 'shell = True' и заподлицо перед чтением и после записи. Теперь моя проблема в том, что я не могу прочитать, что такое вводное приглашение, я должен написать, прежде чем я смогу прочитать. Есть ли способ чтения, пока файл ждет ввода, а затем «переадресовывает» вход пользователя из этого файла в процесс? –

+0

@HaydenR Проблема может заключаться в том, что приглашение не сбрасывается 'input'. Попробуйте изменить 'input (prompt)' с помощью 'sys.stdout.write (prompt): sys.stdout.flush(); input()' и посмотреть, не изменилось ли это. Если это так, вы должны написать простую оболочку вокруг 'input', которая сбрасывает приглашение. – Bakuriu

Смежные вопросы