在Python 2.5中使用subprocess.Popen访问子进程创建的文件描述符

在Python 2.5中使用subprocess.Popen访问子进程创建的文件描述符,python,io,subprocess,pipe,Python,Io,Subprocess,Pipe,Python 2.5是否可以访问subprocess.Popen()子进程打开的文件描述符?不是特别是输入和输出,而是它创建的其他管道?如果是的话,我会怎么做?感谢您的帮助。没有跨平台的方式访问其他进程的文件描述符 在几乎任何POSIX系统上,都可以使用sendmsg通过Unix套接字或管道传递打开的文件(通常需要SCM\u权限),Windows具有不同但相似的功能。因此,如果您控制子进程,就可以这样做。这允许您拥有相同的实际文件对象和/或其克隆,尽管您仍将拥有该对象的不同描述符(少量)或句柄

Python 2.5是否可以访问subprocess.Popen()子进程打开的文件描述符?不是特别是输入和输出,而是它创建的其他管道?如果是的话,我会怎么做?感谢您的帮助。

没有跨平台的方式访问其他进程的文件描述符

在几乎任何POSIX系统上,都可以使用
sendmsg
通过Unix套接字或管道传递打开的文件(通常需要
SCM\u权限
),Windows具有不同但相似的功能。因此,如果您控制子进程,就可以这样做。这允许您拥有相同的实际文件对象和/或其克隆,尽管您仍将拥有该对象的不同描述符(少量)或句柄

一些平台可以通过使用描述符或句柄显式访问另一个进程的文件句柄。例如,在linux上,
'/proc/{}/fd/{}.format(childpid,childfd)
将是打开文件的符号链接(即使它不在文件系统的名称可访问部分中),当然,在这种情况下,同一文件的文件对象不同。Windows具有NT级别的API,用于枚举子进程的所有打开句柄;除非孩子明确地给你,否则你通常无法访问它们,但是你可以获取路径名并自己打开它。(当然,尽管任何关闭exec文件的操作都会被破坏,所以要小心……如果要使用stdin/out/err管道,它会变得复杂得多。)

最后,一些平台有办法在分叉新进程和启动新线程之间做一些事情。例如,在linux中,除了将
CLONE\u FILES
设置为true之外,您可以使用与
fork
中相同的所有标志,然后您将有一个单独的进程共享文件描述符表。然后,您可以实际使用相同的文件描述符编号来引用相同的文件对象。这显然不是由
子流程
完成的,但是要完成(或者,如果您使用的是3.1或更早版本,更好的是,使用backport)并制作自己的版本来完成这一工作并不难

如果您想要一个跨平台的解决方案,您可以自己构建一个。例如,在大多数情况下,您只需在管道上传递绝对路径名,并让父级打开与子级相同的文件。除非您真的需要在文件或类似文件中共享位置,或者将文件描述符用于无法访问的文件(并且在这两种情况下,您可能都没有编写跨平台代码),否则这通常也会起到同样的作用,而且会简单得多。

可能重复