Python Subprocess.Popen из потока - PullRequest
27 голосов
/ 12 июня 2009

Я пытаюсь запустить 'rsync', используя модуль подпроцесса и Popen внутри потока. После того, как я вызову rsync, мне нужно прочитать вывод. Я использую метод связи, чтобы прочитать вывод. Код работает нормально, когда я не использую поток. Похоже, что когда я использую поток, он висит на вызове связи. Еще одна вещь, которую я заметил, это то, что когда я устанавливаю shell = False, я ничего не получаю от общения при работе в потоке.

Ответы [ 2 ]

39 голосов
/ 12 июня 2009

Вы не предоставили нам код для просмотра, но вот пример, который делает нечто похожее на то, что вы описываете:

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
13 голосов
/ 02 февраля 2011

Вот отличная реализация, не использующая потоки: постоянно принт-подпроцесс-выход-то время-процесс-это-работает

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'])
...