【发布时间】:2018-06-12 12:12:12
【问题描述】:
所以标题有点长,但这是我在网上唯一找不到的东西,有点搜索。如何从子进程访问 pass_fds 参数?
# parent.py
import subprocess
subprocess.Popen(['run', 'some', 'program'], pass_fds=(afd, bfd))
# child.py
import subprocess
# need to access pass_fds argument? but how?
【问题讨论】:
-
所以我想唯一的方法是在不使用其他一些 ipc 技术的情况下将文件描述符发送到子进程的标准输入。然后孩子会从标准输入读取并根据收到的 fd 采取行动
-
...您可以使用任何特定于操作系统的接口(即 procfs)来反省子级可用的开放 FD,并尝试从元数据中推断出有趣的(即,如果您希望有两个 TCP 套接字,则扫描它们),但这似乎很容易出错,而不是具有显式接口。
-
@charles 当然我通常会使用共享内存之类的东西,但这似乎不是 python-ish 并且认为我可能错过了一些信息。但是在深入研究
subprocess.Popen的 cpython 源代码后,我注意到它们试图尽可能通用,因此它们没有包含机制,如果所述命令仍在调用 python 并做一些(魔术)技巧来处理和存储到预定义变量等 -
subprocess旨在用于调用非 Python 代码。如果您创建子进程是为了明确地在其中运行 Python 代码,那么您应该使用multiprocessing。
标签: python python-3.x subprocess popen file-descriptor