python
  • popen
  • 2012-01-17 12 views 8 likes 
    8

    Próba przekierowania wyjścia podprocesu do pliku.subprocess.Popen() Przekierowanie IO

    server.py:

    while 1: 
        print "Count " + str(count) 
        sys.stdout.flush() 
        count = count + 1 
        time.sleep(1) 
    

    Laucher:

    cmd = './server.py >temp.txt' 
    args = shlex.split(cmd) 
    server = subprocess.Popen(args) 
    

    Wyjście wyświetlany na ekranie, temp.txt pozostaje pusta. Co robię źle?

    Jako tło próbuję uchwycić wynik programu, który został już napisany.

    nie mogę użyć:

    server = subprocess.Popen(
           [exe_name], 
           stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
    

    jak program może nie spłukiwania. Zamiast tego miałem zamiar przekierować wyjście przez fifo. Działa to dobrze, jeśli ręcznie uruchamiam serwer.py, ale oczywiście nie, jeśli przekierowanie nie działa. ps -aux pokazuje, że server.py został poprawnie uruchomiony.

    Odpowiedz

    7

    Altenatively, można użyć parametru stdout z obiektem pliku:

    with open('temp.txt', 'w') as output: 
        server = subprocess.Popen('./server.py', stdout=output) 
        server.communicate() 
    

    Jak wyjaśniono w documentation:

    stdin, stdout i stderr określić odpowiednio wykonano standardowe wejścia, standardowe wyjście i standardowe uchwyty plików błędów. Poprawne wartości to PIPE, istniejący deskryptor pliku (dodatnia liczba całkowita), istniejący obiekt pliku i Brak.

    +0

    To działa. Communicate będzie blokować czytnik, dopóki serwer nie zakończy działania, ale teraz, gdy mogę przekierować, mogę wysłać wynik serwera do fifo. –

    +1

    nie trzeba wywoływać '.communicate()' tutaj. 'subprocess.check_call ('command', stdout = file)' działa. – jfs

    4

    Przekierowywanie wyjścia za pomocą ">" jest funkcją powłok - domyślnie subprocess.Popen nie tworzy instancji. To powinno działać:

    server = subprocess.Popen(args, shell=True) 
    
    +0

    Użycie 'shell = True' nie jest preferowanym sposobem, chyba że jest to konieczne (a tutaj nie jest) – wim

    Powiązane problemy