Как порождать несколько скриптов Python из программы Python? - PullRequest
3 голосов
/ 07 июня 2009

Я хочу порождать (форк?) Несколько скриптов Python из моей программы (также написанной на Python).

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

Я пытался использовать pexpect, os.execlp и os.forkpty, но ни один из них не делает, как я ожидаю.

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

Есть ли какая-либо библиотека / лучшие практики / и т.д. выполнить эту работу?

p.s. Прежде чем спросить, почему я пишу в STDOUT и читаю из него, скажу, что я не пишу в STDOUT, я читаю вывод tshark.

Ответы [ 3 ]

5 голосов
/ 07 июня 2009

См. модуль подпроцесса

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

os.system

os.spawn *

os.popen *

popen2. *

команды. *

0 голосов
/ 12 июля 2014

Вы хотите выделить один терминал или одну оболочку Python?

У вас уже есть несколько полезных ответов для Popen и Subprocess, вы также можете использовать pexpect, если вы все равно планируете его использовать.

#for multiple python shells
import pexpect

#make your commands however you want them, this is just one method
mycommand1 = "print 'hello first python shell'"
mycommand2 = "print 'this is my second shell'"

#add a "for" statement if you want
child1 = pexpect.spawn('python')
child1.sendline(mycommand1)

child2 = pexpect.spawn('python')
child2.sendline(mycommand2)

Сделайте столько детей / оболочек, сколько вы хотите, а затем используйте child.before () или child.after () для получения ваших ответов.

Конечно, вы хотите добавить определения или классы для отправки вместо "mycommand1", но это всего лишь простой пример.

Если вы хотите собрать несколько терминалов в Linux, вам просто нужно заменить 'python' в строке pextpext.spawn

Примечание: я не проверял вышеуказанный код. Я просто отвечаю из прошлого опыта с pexpect.

0 голосов
/ 09 июня 2009

Я не понимаю, почему вы должны ожидать этого. tshark должен отправить свой вывод в stdout, и только по какой-то странной причине он отправит его в stderr.

Следовательно, то, что вы хотите, должно быть:

import subprocess

fp= subprocess.Popen( ("/usr/bin/tshark", "option1", "option2"), stdout=subprocess.PIPE).stdout
# now, whenever you are ready, read stuff from fp
...