web-dev-qa-db-ja.com

PythonスレッドからのSubprocess.Popen

スレッド内でサブプロセスモジュールとPopenを使用して「rsync」を起動しようとしています。 rsyncを呼び出した後、出力も読み取る必要があります。通信方法を使用して出力を読み取っています。スレッドを使用しない場合、コードは正常に実行されます。スレッドを使用すると、通信呼び出しでハングするようです。もう1つ気づいたのは、Shell = Falseを設定すると、スレッドで実行しているときに通信から何も返されないことです。

27
noahd

確認するコードを提供していませんが、ここに、あなたが説明したものと同様の処理を行うサンプルがあります。

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
39
Ryan Bright

スレッドを使用しない優れた実装は次のとおりです。 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'])
13
nmanos