Я пытаюсь запустить 'rsync', используя модуль подпроцесса и Popen внутри потока. После вызова rsync мне нужно также прочитать результат. Я использую метод связи для чтения вывода. Код работает нормально, когда я не использую нить. Похоже, что когда я использую поток, он зависает на вызове связи. Еще одна вещь, которую я заметил, это то, что когда я устанавливаю shell = False, я ничего не получаю от общения при запуске в потоке.Python Subprocess.Popen из потока
21
A
ответ
33
Вы не предоставили никакого кода для нас, чтобы посмотреть, но вот пример, который делает что-то подобное тому, что вы описали:
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
Вот большая реализация не используя темы: 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
Следует отметить, что эта реализация будет блокироваться на 'process.stdout.readline()'. – Ian
Смежные вопросы
- 1. Python subprocess.Popen()
- 2. Каково состояние блокировки потока в python после вызова. Subprocess.popen
- 3. Python: subprocess.Popen поведение переменной
- 4. python subprocess.Popen stdin.write
- 5. Python Subprocess.Popen ошибка атрибута?
- 6. Python subprocess.popen() без ожидания
- 7. Перенаправление Python в subprocess.Popen
- 8. python subprocess.Popen hanging
- 9. Python subprocess.popen wrong pid
- 10. Python subprocess.Popen без присоединения
- 11. Отключить вывод консоли из subprocess.Popen в Python
- 12. Python subprocess.Popen общаться через трубопровод
- 13. Получение всего вывода из subprocess.Popen
- 14. Как использовать STDIN из subprocess.Popen
- 15. Python: subprocess.Popen никогда не возвращает
- 16. Python subprocess.popen и rdiff-backup
- 17. space in python subprocess.Popen() arguments
- 18. Python subprocess.Popen() wait for complete
- 19. Python subprocess.Popen возвращается пустая строка
- 20. процесса Python трубы с subprocess.Popen
- 21. using subprocess.popen с ssh - python
- 22. Python subprocess.Popen в другом каталоге
- 23. Python Eclipse, резьбовая subprocess.Popen() <прекращается, значение выхода: 137>
- 24. subprocess.Popen не хранит исключение из файла ошибки
- 25. subprocess.Popen и буферизованный выход процесса
- 26. Выход из потока в python?
- 27. Python: возвращает результат из потока
- 28. Выход из потока в Python
- 29. python subprocess.popen войти в бесконечный цикл
- 30. Python subprocess.Popen для создания нового каталога
Да, это точно то, что я делаю. Тем не менее, я хотел бы прочитать результат внутри потока. Следует также отметить, что я использую Python 2.3. Я взял копию подпроцесса с 2.4. – noahd
, тогда, пожалуйста, отметьте это как «ответил» –
Мне должно быть более ясно, что это то, что я делаю, но это не работает. В этом случае вызов связи не возвращает ничего, и команда не появляется. Если я установлю shell = True, то связывается поток. Затем, после того как я остановил python, я заканчиваю несуществующий процесс ssh. – noahd