python: неблокирующий подпроцесс, проверьте стандартный вывод - PullRequest
4 голосов
/ 03 января 2011

Хорошо, проблема, которую я пытаюсь решить, заключается в следующем:

Мне нужно запустить программу с установленными флагами, проверить ее ход и доложить на сервер.Поэтому мне нужен мой сценарий, чтобы избежать блокировки во время выполнения программы, но мне также нужно иметь возможность прочитать вывод.К сожалению, я не думаю, что какой-либо из методов, доступных в Popen, будет читать вывод без блокировки.Я попробовал следующее, что немного хакерски (мы можем читать и писать в один и тот же файл из двух разных объектов?)

import time
import subprocess
from subprocess import *
with open("stdout.txt", "wb") as outf:
    with open("stderr.txt", "wb") as errf:
        command = ['Path\\To\\Program.exe', 'para', 'met', 'ers']
        p = subprocess.Popen(command, stdout=outf, stderr=errf)
        isdone = False
        while not isdone :
            with open("stdout.txt", "rb") as readoutf: #this feels wrong
                for line in readoutf:
                    print(line)
            print("waiting...\\r\\n")
            if(p.poll() != None) :
                done = True
            time.sleep(1)
        output = p.communicate()[0]    
        print(output)

К сожалению, Попен, похоже, не пишет в мойдо тех пор, пока команда не завершится.

Кто-нибудь знает способ сделать это?Я не посвящен использованию Python, но мне нужно отправлять запросы POST на сервер в том же сценарии, поэтому Python казался более простым выбором, чем, скажем, сценарии оболочки.

Спасибо!Будет

Ответы [ 2 ]

8 голосов
/ 03 января 2011

В основном у вас есть 3 варианта:

  1. Используйте threading для чтения в другом потоке без блокировки основного потока.
  2. select на стандартный вывод, стандартный вывод вместо communicate. Таким образом, вы можете читать только тогда, когда данные доступны, и избежать блокировки.
  3. Пусть библиотека решит это, twisted - очевидный выбор .
2 голосов
/ 03 января 2011

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

http://www.cs.lth.se/EDA046/assignments/assignment4/twisted/listings/process/quotes.py

документация: http://www.cs.lth.se/EDA046/assignments/assignment4/twisted/process.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...