Python, фальсификация стандартного ввода - PullRequest
1 голос
/ 26 января 2011

В настоящее время я пишу абстракцию над darcs в python, однако, как только я пытаюсь отправить данные в мой репозиторий, репозиторий запрашивает ключ;Я думал, можно ли было заставить python отправлять ключи в darcs, используя stdin или что-то еще, чтобы эмулировать то, что пользователь будет печатать, начиная с этого пути;Я мог бы позволить пользователям просто сохранять файл со своей информацией, а python просто читал этот файл и запускал его содержимое.

def execute(cmd):
    proc = subprocess.Popen(cmd, shell=True)
    proc.wait()

Код, который я использую для запуска дарков;выполнить ("darcs% s"% (parems))

Ответы [ 2 ]

4 голосов
/ 26 января 2011

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

См .: http://pypi.python.org/pypi/pexpect/

Пример использования из документов:

   import pexpect
   child = pexpect.spawn ('ftp ftp.openbsd.org')
   child.expect ('Name .*: ')
   child.sendline ('anonymous')
   child.expect ('Password:')
   child.sendline ('noah@example.com')
   child.expect ('ftp> ')
   child.sendline ('cd pub')
   child.expect('ftp> ')
   child.sendline ('get ls-lR.gz')
   child.expect('ftp> ')
   child.sendline ('bye')
3 голосов
/ 26 января 2011

Используйте модуль subprocess :

Модуль subprocess позволяет создавать новые процессы, подключаться к их каналам ввода / вывода / ошибок и получать их коды возврата.

Для связи используется метод subprocess.Popen.communicate:

Popen.communicate(input=None)

Взаимодействие с процессом: отправка данных на стандартный ввод. Читайте данные из stdout и stderr, пока не будет достигнут конец файла. Подождите, пока процесс завершится. Необязательным входным аргументом должна быть строка для отправки дочернему процессу , или None, если никакие данные не должны быть отправлены дочернему процессу.

connect () возвращает кортеж (stdoutdata, stderrdata).

Обратите внимание, что если вы хотите отправить данные в стандартный поток процесса, вам нужно создать объект Popen с stdin=PIPE. Точно так же, чтобы получить что-то кроме None в кортеже результата, вам нужно также указать stdout=PIPE и / или stderr=PIPE.

...