Python Subprocess.Popen à partir d'un thread

j'essaie de lancer un 'rsync' en utilisant le module subprocess et de Popen à l'intérieur d'un thread. Après que j'ai appelé le rsync je dois lire la sortie aussi bien. J'utilise la méthode communicate pour lire la sortie. Le code fonctionne bien quand je n'utilise pas de thread. Il semble que lorsque j'utilise un thread il se bloque sur l'communiquer appel. Une autre chose que j'ai remarqué, c'est que quand je mets shell=False, Je n'obtiens rien en retour de la communication lorsque je cours dans un thread.

26
demandé sur noahd 2009-06-12 08:13:25

2 réponses

vous n'avez pas fourni de code à regarder, Mais voici un échantillon qui fait quelque chose de similaire à ce que vous décrivez:

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
37
répondu Ryan Bright 2009-06-12 04:39:35

Voici une grande implémentation n'utilisant pas les threads: permanence-print-sous-processus-sortie-en-processus qui est en cours d'exécution

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
répondu nmanos 2017-05-23 12:09:35