如何从子进程访问子进程 Popen pass_fds 参数?

Yak*_*kan 4 python subprocess file-descriptor popen python-3.x

所以标题有点长,但这是我唯一在网上找不到的东西,稍微搜索了一下。如何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?
Run Code Online (Sandbox Code Playgroud)

Sha*_*ger 5

您需要以某种方式明确告知孩子通过的 fds。最常见/最简单的机制是:

  1. 通过为孩子设置的环境变量
  2. 通过传递给孩子的参数
  3. (不太常见,但可能)写给孩子的 stdin

这些当然都需要孩子的配合;它需要定义一个接口来通知它通过的 fds。

openssl的命令行工具支持所有这些用于类似目的的机制(将密码短语传达给孩子而不将其放在命令行上)。您传递-pass了第二个参数,该参数定义了在哪里查找密码。如果第二个参数是stdin,则从 读取stdin,如果是-pass fd:#(其中#是 fd 编号),则从提供的任意文件描述符中读取,-pass env:var(其中var是环境变量的名称)从环境中读取,等等。