неблокирующий подпроцесс python и возвращающий вывод - PullRequest
0 голосов
/ 13 декабря 2011

Я знаю, что об этом спрашивали много раз, но мне еще предстоит найти правильный способ сделать это.Если я хочу выполнить локальную команду, в документах говорится, что я должен использовать подпроцесс, поскольку он заменяет все другие методы, такие как os.system / peopen и т. Д.

Если я вызываю subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) в моей программе, и команданапример, директива openvpn, которая соединяет мой компьютер с VPN, процесс будет зависать бесконечно, так как openvpn возвращает свой вывод, заканчивающийся новой строкой, но зависает там, когда подключен, и моя программа (замороженная) тоже.

Некоторые говорят,Я должен удалить stdout=subprocess.PIPE, который действительно работает неблокирующим образом, но затем все выводится на консоль вместо того, чтобы у меня был какой-то контроль над выводом (возможно, я не хочу его печатать).

Так есть ли какой-то правильный способ сделать это, например, может быть выполнение команд неблокирующим способом, а также иметь контроль над выводом .?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2011

Если вы укажете stdout = PIPE, то ваш подпроцесс запишет в канал и зависнет, когда буфер канала заполнится. Программа на python не должна зависать - Popen асинхронный, поэтому Popen.wait() можно вызвать позже, чтобы дождаться завершения подпроцесса. Прочтите Popen.stdout, чтобы подпроцесс был доволен, и распечатайте, отбросьте или обработайте вывод, как считаете нужным.

0 голосов
/ 13 декабря 2011

Рассмотрите возможность запуска вашего процесса в терминале. Например,

subprocess.Popen("xterm -e /bin/bash -c '/path/to/openvpn'", shell=True)

или даже, вы можете попробовать,

import shlex
subprocess.Poen(shlex.split("xterm -e /bin/bash -c '/path/to/openvpn'"), shell=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...