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

如何在Python中通过管道连接到os.execv'd进程的stdin,python,operating-system,Python,Operating System,我想在进程的stdin中写一些东西来替换我当前的Python进程。有没有一个简单的方法可以做到这一点?我当时在想 import sys, os r, w = os.pipe() os.write(w, 'yo') os.dup2(r, sys.stdin.fileno()) os.execvp('cat', ['']) 但当我在OSX中执行此操作时,cat挂起,尽管“yo”确实会显示出来。为什么?在执行子进程之前,您必须先执行该进程;然后,父对象写入管道,而子对象从中读取。父级还必须在for

我想在进程的stdin中写一些东西来替换我当前的Python进程。有没有一个简单的方法可以做到这一点?我当时在想

import sys, os

r, w = os.pipe()
os.write(w, 'yo')
os.dup2(r, sys.stdin.fileno())
os.execvp('cat', [''])
但当我在OSX中执行此操作时,cat挂起,尽管“yo”确实会显示出来。为什么?

在执行子进程之前,您必须先执行该进程;然后,父对象写入管道,而子对象从中读取。父级还必须在fork之后关闭管道的读取端,子级必须将读取端复制到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()

如果您将多个管道缓冲区的数据写入大小随操作系统等而变化的管道,则此类代码是危险的。,然后你会使你的进程死锁,因为还没有读卡器来排空管道。那么,我如何才能以安全的方式做我想做的事情——而不写临时文件呢?在执行子进程之前,你可以操作系统分叉进程;然后,父对象写入管道,而子对象从中读取。父级还必须在fork之后关闭管道的读取端,子级必须将读取端复制到stdin上,然后在execvp之前关闭两个原始管道句柄。这是相当标准的Unix管道。亚当,如果你还想写评论作为答案,我会选择它。从你写的和我自己的错误中学习。