2010-11-13 3 views
1

Мне нужно сделать две программы (например, «сценарий A» (.py) и «script B» (.exe)). Обе программы находятся в бесконечном цикле: Script A нужно записать в stdin скрипта B, а затем читать stdout скрипта B после этого писать снова и т. Д. Script B Я не могу изменить.Выполнение двух сценариев связи

Оба файла находятся на моем жестком диске, поэтому я должен найти лучший способ решить эту проблему, нежели создавать сети. Я могу, однако, написать файлы со сценарием A. Это не домашнее задание курса, я пишу графический интерфейс для игры, и у меня есть несколько запрограммированных AI. Я думал о трубопроводе (python scripta.py | scriptb.exe), но, похоже, для завершения скрипта B должен выполняться сценарий A. Опять же, поскольку я никогда не использовал трубопровод, я мог бы пропустить что-то очевидное.

Я бы предпочел, чтобы необходимые инструменты были частью стандартной библиотеки, но если они не слишком плохи.

Решение должно работать как на Linux, так и на Windows. Может ли кто-нибудь из вас указать мне в правильном направлении? Спасибо за ваше время.

ответ

6

Если вы запускаете «Script B» из «скрипта A», используя модуль подпроцесса, вы сможете напрямую взаимодействовать со своим stdin и stdout. Например:

from subprocess import Popen, PIPE 

prog = Popen("scriptA.exe", shell=True, stdin=PIPE, stdout=PIPE) 

prog.stdin.write("This will go to script A\n") 
print prog.stdout.read() 

prog.wait() # Wait for scriptA to finish 

Просто будьте осторожны, так как звонки читать будет блокировать, то есть, если сценарий не имеет ничего, чтобы напечатать, то вызов будет висеть, пока он не делает. Самый простой способ избежать этого - использовать потоки.

+0

Вы должны использовать 'print prog.communicate ('Это перейдет к скрипту A') [0]', а не напрямую использовать prog.stdin и prog.stdout - прочитайте в документации по модулю модуля 'subprocess' предупреждение о том, что вы не используете stdin и stdout напрямую. –

+0

@ Крис прав, если дочерний процесс генерирует значительный объем вывода. –

+0

@ Zach: «Предупреждение: используйте' общаться() ', а не' .stdin.write', '.stdout.read' или' .stderr.read', чтобы избежать взаимоблокировок из-за заполнения любого из других буферов буферов OS блокируя дочерний процесс ». Я бы подумал, что лучше всего использовать «общаться» абсолютно всегда; Я не использовал его с чем-то большим, чем несколько сотен байт, но я использую 'communication', и он работает хорошо - есть ли причина, по которой вы использовали' .stdin.write' и '.stdout.read' напрямую? –

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