Próbuję uruchomić "rsync" przy użyciu modułu podprocesowego i Popen wewnątrz wątku. Po wywołaniu rsync muszę również przeczytać dane wyjściowe. Używam metody komunikacji, aby odczytać wynik. Kod działa poprawnie, gdy nie używam wątku. Wygląda na to, że kiedy używam wątku, zawiesza się on na połączeniu komunikacyjnym. Inną rzeczą, którą zauważyłem jest to, że kiedy ustawiam shell = False, nic nie odzyskają komunikacji podczas działania w wątku.Podproces Pythona.Popen z wątku
21
A
Odpowiedz
33
Nie dostarczamy żadnego kodu dla nas patrzeć, ale tutaj jest próbka, która robi coś podobnego do tego, co można opisać:
import threading
import subprocess
class MyClass(threading.Thread):
def __init__(self):
self.stdout = None
self.stderr = None
threading.Thread.__init__(self)
def run(self):
p = subprocess.Popen('rsync -av /etc/passwd /tmp'.split(),
shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
self.stdout, self.stderr = p.communicate()
myclass = MyClass()
myclass.start()
myclass.join()
print myclass.stdout
9
Oto wielka realizacja nie używając wątki: constantly-print-subprocess-output-while-process-is-running
import subprocess
def execute(command):
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = ''
# Poll process for new output until finished
for line in iter(process.stdout.readline, ""):
print line,
output += line
process.wait()
exitCode = process.returncode
if (exitCode == 0):
return output
else:
raise Exception(command, exitCode, output)
execute(['ping', 'localhost'])
+4
Należy zauważyć, że ta implementacja będzie blokować na 'process.stdout.readline()'. – Ian
Powiązane problemy
- 1. Podproces plik błąd
- 2. Podproces FFMPEG i Pythons
- 3. Podproces Python wprowadza spacje
- 4. Python podproces Pomoc
- 5. Podproces Pythona równolegle
- 6. argumenty Pythona podproces
- 7. Python: podproces z innego katalogu roboczego
- 8. rurociągi Shell z podproces w Pythonie
- 9. Zabijanie podproces tym jego dzieci z pytona
- 10. zakańczanie wątku dodatkowego z głównego wątku (kakao)
- 11. Metoda uruchamiania głównego wątku z innego wątku
- 12. Pythona podproces .check_call vs .check_output
- 13. Python: wykonać koci podproces równolegle
- 14. Python podproces bash: nawiasy klamrowe
- 15. Jak korzystać podproces POPEN Python
- 16. Wyjście z wątku
- 17. Jak rozwiązać podproces Pythona uruchomiony z powłoki = True
- 18. Pierwsze stdout z podproces tcpdump po zakończeniu to
- 19. Jak ukryć wyjście podproces w Pythonie 2.7
- 20. wykonać polecenie cat w podproces, popen() Pythona
- 21. Podproces Pythona Popen.communicate() jest odpowiednikiem Popen.stdout.read()?
- 22. Metoda wywołania na wątku GUI z wątku timerów
- 23. PySide czekać na sygnał z głównego wątku w wątku roboczy
- 24. C#: Pokaż okno dialogowe na wątku UI z innego wątku
- 25. Zakleszczenie podczas wywoływania wątku interfejsu użytkownika z wątku roboczego
- 26. android - wywoływanie wątku interfejsu użytkownika z wątku roboczego
- 27. Jak przekazać wyjątek z wątku do wątku (dzwoniącego) w Delphi?
- 28. jest + = w wątku wątku bezpieczne?
- 29. początkujących pyton podproces: „błąd zapisu: Broken pipe”
- 30. Podproces Pythona check_output dużo wolniej niż zadzwoń
Tak, to dokładnie to, co robię. Chciałbym jednak przeczytać wynik w wątku. Powinienem również zauważyć, że używam Pythona 2.3. Zdobyłem kopię podprocesu z 2.4. – noahd
następnie proszę oznaczyć to jako "odpowiedział" –
Powinienem być bardziej jasne, że to, co robię, ale to nie działa. W takim przypadku wywołanie komunikacyjne nie zwróci niczego, a polecenie nie wydaje się być wykonywane. Jeśli ustawię shell = True, komenda zawiesza wątek. Następnie po zatrzymaniu pytona kończę z nieistniejącym procesem ssh. – noahd