Предполагая, что вы хотите иметь возможность запускать оболочку и отправлять ей несколько команд (и читать их вывод), похоже, вы можете сделать что-то вроде этого:
from subprocess import *
p = Popen(['/bin/sh'], shell=False, stdin=PIPE, stdout=PIPE, stderr=PIPE)
После чего, например:
>>> p.stdin.write("cat /etc/motd\n")
>>> p.stdout.readline()
'Welcome to dev-linux.mongo.com.\n'
(Конечно, вы должны также проверить stderr
или попросить Popen
объединить его с stdout
). Одна из основных проблем с вышеприведенным заключается в том, что каналы stdin
и stdout
находятся в режиме блокировки, поэтому легко застрять, ожидая вывода из оболочки навсегда. Хотя я еще не пробовал, на сайте ActiveState есть рецепт , который показывает, как решить эту проблему.
Обновление : после просмотра связанных вопросов / ответов может показаться, что проще использовать встроенный в Python модуль select
, чтобы посмотреть, есть ли данные для чтения stdout
( Вы также должны сделать то же самое для stderr
, конечно), например:
>>> select.select([p.stdout], [], [], 0)
([<open file '<fdopen>', mode 'rb' at 0x10341690>], [], [])