2017-05-19 35 views
1

私は現在のプロセスを置き換えるのにPythonのos.execvを使いたいですが、新しいプロセスがstdoutを別のプロセス(ログを収集してネットワーク経由で出荷する)に送ることも欲しいです。ログを収集するプロセスは、オリジナルのPythonプロセスによっても開始する必要があります。Pythonのexecvとパイプ出力

私はフォーク、dup2、execvのものを行う必要があると推測していますが、私はいくつかの助けが必要です。 bashで

、それはあなたがこのようにパイプとプロセスを設定することができ、この

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

'subprocess'モジュールはあなたのためにこれを行うことができます。https://gist.github.com/JacobIRR/dced5ce0f19e4f376aaef19d0e80d9d7 – JacobIRR

+1

@JacobIRRサブプロセスでコマンドを実行することを、それが現在のプロセスに代わるものではありません。 – Barmar

+1

微妙なことに、Bashではそれはあなたが思うところではありません。メインプロセスはパイプラインの最終段階に従っているので、 'exec'は効果がありません。明確化のために@ephemientありがとう。 – ephemient

答えて

2

ようになります。

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

それは、少なくとも最初の部分のために、しかしsubprocessを使用することが便利です。

import os 
import subprocess 

p = subprocess.Popen(['./bar'], stdin=subprocess.PIPE) 
os.dup2(p.stdin.fileno(), 1) 
p.stdin.close() 
os.execlp('./foo', './foo') 
関連する問題