Python 2.5是否可以访问subprocess.Popen()子进程打开的文件描述符?不是具体的输入和输出,而是它创建的其他管道?如果是这样,我该怎么做?感谢帮助。
答案 0 :(得分:0)
没有跨平台方式来访问其他进程的文件描述符。
在几乎任何POSIX系统上,您都可以使用sendmsg
通过Unix套接字或管道传递打开的文件(通常需要SCM_RIGHTS
),而Windows具有不同但相似的功能。因此,如果您控制子进程,您可以这样做。这允许您拥有相同的实际文件对象和/或它的克隆,尽管您仍然有一个不同的描述符(小数字)或该对象的句柄。
有些平台可以通过使用描述符或句柄显式访问另一个进程的文件句柄。例如,在linux上,'/proc/{}/fd/{}'.format(childpid, childfd)
将是打开文件的符号链接(即使它不在文件系统的名称可访问的部分中),当然在这种情况下你最终会得到一个不同的文件对象同一个文件。 Windows具有NT级API,用于枚举子进程的所有打开句柄;你通常无法访问它们,除非孩子明确地给你,但你可以获得路径名并为自己打开它。 (当然,任何close-on-exec文件都会被破坏,所以要小心......如果你想使用stdin / out / err管道,它会变得更加复杂。)
最后,一些平台可以在分配新流程和启动新线程之间做一些事情。例如,对于linux,您可以clone
使用与fork
中相同的所有标志,但CLONE_FILES
设置为true除外,然后您将拥有一个单独的进程但仍然共享文件描述符表。然后,您实际上可以使用相同的文件描述符编号来引用相同的文件对象。这显然不是由subprocess
完成的,但是分叉subprocess
source并不是很难(或者,更好的是,如果您使用的是3.1或更早版本,subprocess32
backport)并制作你自己的版本。
如果您想要跨平台解决方案,可以自己构建一个。例如,在大多数情况下,您只需在管道上传递绝对路径名,并让父项打开与子项相同的文件。除非您确实需要在文件或类似文件中共享位置,或者正在使用文件描述符来访问您无法访问的文件作为可通过的功能(在任何一种情况下,您可能都不会编写跨平台代码),这将是通常工作也一样,而且更简单。