Запуск внешней интерактивной программы из скрипта Python - PullRequest
0 голосов
/ 17 июля 2011

У меня есть скрипт на python, который пытается выполнять внешние программы. Мой проект включает в себя говорящего бота Python, с помощью которого клиент должен иметь возможность выполнять команды в удаленном терминале.

Таким образом, в основном модуль, включающий говорящего бота, позволяет мне только получать входные данные и отправлять выходные данные. Мне нужно взять входные данные и посмотреть, является ли это командой терминала и выполнить ее.

Итак, я использовал объект subprocess.Popen для реализации этого.

Проблема в том, что если команда вызывает интерактивную программу, т.е. ждет ввода и выдаёт вывод, я не могу с этим справиться. В лучшем случае, Попен ждет всех входов и затем выдает результат.

Есть ли способ сделать это правильно, т.е. запустить внешнюю программу и отправить ввод, получить вывод; отправлять ввод, получать вывод и т. д.

Ответы [ 2 ]

0 голосов
/ 17 июля 2011

pexpect может быть то, что вам нужно.

0 голосов
/ 17 июля 2011

На мой взгляд, лучшая модель для такого рода проблем - использование асинхронного однопоточного подхода, но он требует некоторого сложного кода даже с использованием вспомогательных библиотек.

Что-то концептуально более простое - использование многопоточного подхода

import thread
import sys
import time

def repl():
    while True:
        print ">>> ",
        sys.stdout.flush()
        s = raw_input()
        exec s

def main_thread():
    for i in xrange(30):
        print i
        time.sleep(1)

thread.start_new_thread(repl, ())
main_thread()

В приведенном выше коде функция repl ожидает ввода и затем выполняет все, что было введено в приглашении, но в то же время запускается основная программа (здесь она не делает ничего интересного, просто считает до 30).

В зависимости от сложности вашей программы это может быть разумным решением. Обратите внимание, что после определенного уровня параллельного выполнения и логической сложности многопоточный подход показывает некоторый недостаток (сложная и трудная для отладки логика блокировки)

...