2017-05-19 4 views
1

Je voudrais utiliser le os.execv de Python pour remplacer mon processus actuel, mais je souhaite également que le nouveau processus envoie stdout à un autre processus (pour collecter les journaux et les envoyer sur le réseau). Le processus de collecte des journaux doit également être démarré par le processus Python d'origine.Exécution Python execv et pipe

Je suppose que je dois faire un peu de fork, dup2, execv, mais j'ai besoin d'aide.

En bash, il pourrait ressembler à ceci

#!/bin/bash 
exec ./foo ∣ ./bar 
+1

le module 'subprocess' peut faire pour vous: https://gist.github.com/JacobIRR/dced5ce0f19e4f376aaef19d0e80d9d7 – JacobIRR

+1

@JacobIRR qui exécute la commande dans un sous-processus, il ne remplace pas le processus en cours. – Barmar

+1

Note mineure, qui ne fait pas tout à fait ce que vous pensez dans Bash - le processus principal suit la dernière étape du pipeline, donc 'exec' n'a aucun effet. – ephemient

Répondre

2

Vous pouvez configurer le tuyau et les processus de cette façon.

import os 

(read_fd, write_fd) = os.pipe() 
pid = os.fork() 
if pid == 0: 
    os.dup2(read_fd, 0) 
    os.close(read_fd) 
    os.close(write_fd) 
    os.execlp('./bar', './bar') 
    os._exit(-1) # in case exec fails 
os.close(read_fd) 
os.dup2(write_fd, 1) 
os.close(write_fd) 
os.execlp('./foo', './foo') 

Il est toujours pratique d'utiliser subprocess si, au moins pour la première partie.

import os 
import subprocess 

p = subprocess.Popen(['./bar'], stdin=subprocess.PIPE) 
os.dup2(p.stdin.fileno(), 1) 
p.stdin.close() 
os.execlp('./foo', './foo')