系统相关
首页 > 系统相关> > 如何在Python中通过管道传输到os.execv进程的stdin

如何在Python中通过管道传输到os.execv进程的stdin

作者:互联网

我想在替换我当前的Python进程的标准输入中写一些东西.是否有捷径可寻?我一直在思考

import sys, os

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

但是当我在OS X中执行此操作时,cat会挂起,尽管会显示’yo’.为什么?

解决方法:

您在execvp()-子进程之前对进程进行os.fork();然后,父级将写入管道,而子级则从管道读取数据.父级也必须在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()

标签:operating-system,python
来源: https://codeday.me/bug/20191121/2053826.html