Python Subprocess.Popen из потока
Я пытаюсь запустить rsync, используя модуль подпроцесса и Popen внутри потока. После того, как я вызову rsync, мне нужно прочитать вывод. Я использую метод связи, чтобы прочитать вывод. Код работает нормально, когда я не использую поток. Похоже, что когда я использую поток, он висит на вызове связи. Еще одна вещь, которую я заметил, это то, что когда я устанавливаю shell=False, я ничего не получаю от общения при работе в потоке.
2 ответа
Решение
Вы не предоставили нам код, на который мы могли бы посмотреть, но вот пример, который делает нечто похожее на то, что вы описываете:
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
Вот отличная реализация, не использующая потоки: постоянно-печатать-подпроцесс-вывод-пока-процесс-работает
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'])