2016-12-04 1 views
0

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

Большинство из этих решений предлагают проверить, нет ли вывода readline, нет или нет, но в моем случае программа никогда не возвращается из последнего чтения и просто висит там.

Edit: TCP сервер не в моей власти, или сказать, что я просто должен проверить серверный скрипт, поэтому я не могу изменить его. Кроме того, можно ли отправлять команды на запуск сервера с использованием python без использования подпроцесса? любая лучшая альтернатива?

def subprocess_cmd(command): 
    process=subprocess.Popen(command,stdin=subprocess.PIPE,stderr=subprocess.STDOUT,stdout=subprocess.PIPE, shell=True) 

for cmd in ['python3 -u tcp_server.py 123 port1']: 
    subprocess_cmd(cmd) 

process.stdin.write('command like print_list') 
process.stdin.flush() 
while True: 
    line=process.stdout.readline() 
    if line == '': 
     break 
+0

вам придется опубликовать свой код, чтобы мы могли помочь. –

+0

@ Jean-FrançoisFabre код был добавлен –

ответ

1

readline висит, потому что ваше соединение TCP остается открытым и readline ожидает больше данных, чтобы войти. Вы должны закрыть соединение с серверной стороне уведомить readline, что нет ничего больше, чтобы читать. Обычно это делается путем закрытия сокета на стороне клиента, уведомляя сервер о том, что на него больше не будет запросов. Когда сервер завершает обработку всех ваших команд, он также закрывает сокет. И это сигнал для вас, что вы получили все данные, которые сервер отправил вам.

Или, если вы не хотите закрыть соединение, вы должны изобрести разделители, которые будут отмечать конец ответа. Таким образом, клиент прекратит вызов readline, когда этот разделитель будет прочитан.

+0

Вы правы, у меня также есть такое же чувство. Но, пожалуйста, прочитайте мое редактирование и сообщите мне, что я могу сделать? –

+0

Согласно вашему коду, tcp_server.py не является TCP-сервером. По крайней мере, вы общаетесь с ним, используя стандартные потоки ввода/вывода, а не TCP. Во всяком случае, причина та же: вы не закрываете stdin. И лучший способ сделать это - использовать 'subprocess.communicate'. Причина описана в документации к функции. –

+0

ОК спасибо за очищение концепции. Принял ваш ответ –