J'ai souvent utilisé la méthode «communiquer» lors de l'exécution de commandes externes à l'aide du module de sous-processus.
python:subprocess.Popen.communicate()
import subprocess
(stdoutdata, stderrdata) = subprocess.Popen(['some', 'command'], stdout=subprocess.PIPE).communicate()
print(stdoutdata)
Cependant, si vous voulez sortir le résultat de manière asynchrone comme un script de construction, il ne peut pas être réalisé par la méthode commun
. Comme indiqué dans Référence de la bibliothèque, la méthode «commun» attend jusqu'à la fin du processus, après quoi les données de sortie standard sont sorties. Parce que je vais le rendre.
Si vous souhaitez remplir cette condition, vous devez utiliser le module io pour créer un flux correspondant à la sortie du processus enfant.
(ref) http://docs.python.jp/2/library/subprocess.html#subprocess.Popen.stdout (ref) https://gist.github.com/mattbornski/3299031
Flux correspondant à la sortie du processus enfant
def exec_process(commands):
process = subprocess.Popen(commands, stdout=subprocess.PIPE, bufsize=-1)
with io.open(process.stdout.fileno(), closefd=False) as stream:
[print(line.rstrip('\n')) for line in stream]
#Attendez la fin du processus et jugez le résultat
process.wait()
if process.returncode != 0:
print('Build process aborts.')
sys.exit(1)
Vous trouverez ci-dessous une note de certains points auxquels j'étais accro
, vous devez donner le chemin du fichier ou le descripteur de fichier (qui peut être obtenu avec
(objet de fichier) .fileno ()). Je ne connais pas le chemin de
subprocess.Popen.stdout, donc je dois lui donner un descripteur de fichier. Notez que nous ne donnons pas l'objet de fichier (=
subprocess.Popen.stdout`) tel quel.(ref) http://docs.python.jp/2/library/io.html#io.open
python
# process.io stdout.S'il est donné directement pour ouvrir, il se terminera par une exception d'exécution.
def exec_process(commands):
process = subprocess.Popen(commands, stdout=subprocess.PIPE, bufsize=-1)
with io.open(process.stdout, closefd=False) as stream:
[print(line.rstrip('\n')) for line in stream]
, vous devez spécifier
closefd = False`. La valeur par défaut est «closefd = True», et dans cet état, l'erreur suivante se produit.close failed in file object destructor:
IOError: [Errno 9] Bad file descriptor
On pense que la cause essaie de fermer l'objet de fichier (= subprocess.Popen.stdout
) que le processus enfant tient au moment où le flux est fermé (= dans ce cas, lors de la sortie de l'instruction with).
Recommended Posts