如何在Python中管道到os.execv'd进程的stdin

时间:2014-05-21 22:21:21

标签: python operating-system

我想写一些进程替换当前Python进程的stdin。是否有捷径可寻?

我正在思考
import sys, os

r, w = os.pipe()
os.write(w, 'yo')
os.dup2(r, sys.stdin.fileno())
os.execvp('cat', [''])

但是当我在OS X中执行此操作时,cat会挂起,但是#哟'确实显示出来。为什么呢?

1 个答案:

答案 0 :(得分:3)

os.fork() execvp()子进程之前的进程; {}然后父进程在子进程读取时写入管道。在close()之后,父级还必须fork()管道的读取端,并且孩子必须dup2()将读取结束到stdin,然后关闭两个原始管道手柄execvp()。这是非常标准的Unix管道。

例如:

r, w = os.pipe()
if os.fork() == 0:
    # Child process
    os.dup2(r, sys.stdin.fileno())
    os.close(r)
    os.close(w)
    os.execvp(...)
else:
    # Parent process
    os.close(r)
    os.write(w, 'yo')
    ...
    os.close(w)  # When done writing
    os.wait()