сделать программы на Python "чат" через канал - PullRequest
1 голос
/ 16 июля 2010

Я пытаюсь заставить два процесса общаться с помощью канала. Я сделал это в родительском процессе:

process = subprocess.Popen(test, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)

process.stdin.write("4\n");
output = process.stdout.read()
print output

и в дочернем процессе:

inp = raw_input()
integer = int(inp)
print integer**2
while(True):
    pass

Я ожидаю, что родительский процесс напечатает 16 ... К сожалению, он остается зависшим, ничего не печатая. Замена бесконечного цикла на сон в течение 5 секунд делает родительский процесс бездействующим в течение 5 секунд и ПОСЛЕ того, что выводится 16. Это показывает, что родительский процесс получает выходные данные только от дочернего процесса после того, как он завершил выполнение.

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

Любая помощь? Спасибо,

Manuel

Ответы [ 4 ]

4 голосов
/ 17 июля 2010

Я вижу ряд возможных проблем:

a) Дочерний процесс фактически никогда не сбрасывает свой вывод и, следовательно, никогда не отправляет свой вывод родительскому процессу.

b) Родительский процесс выполняетсяего read() вызов до того, как дочерний процесс фактически отправил свой вывод (сбросил свой вывод).

c) Родительский процесс выполняет блокировку read(), которая до EOF, что фактически означает, что он ожидает выхода дочернего процесса,Документы subprocess.Popen должны указывать, может ли это быть так.

d) Вызов read() родительского процесса ожидает поступления определенного количества байтов (например, 1024), прежде чем он вернется.

Вероятно, если родитель выполнит много вызовов read(1), и повторная сборка байтов по мере их поступления решит проблему.Или с помощью API связи более высокого уровня, например, используя дейтаграммы вместо анализа потоков байтов.

2 голосов
/ 17 июля 2010

В соответствии с предложением ndim , выполните следующие действия в родительском:

process.stdin.write("4\n")    
process.stdin.flush()    
output = process.stdout.readline()    
print output

Вам также необходимо изменить ребенка:

inp = sys.stdin.readline()
integer = int(inp)
sys.stdout.write("%d\n", (integer ** 2,))
sys.stdout.flush()

Я использовалsys.stdin.readline и sys.stdout.write в стиле.

Я написал 2 тестовых программы , и они отлично работали с python-2.6.4-27 на Fedora 13.

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

Вы должны использовать выбор для этого.Как в методе связи подпроцесса.Об этом есть обсуждение в python tracker .

...