【问题标题】:Popen file descriptor difference between Python 2.6 and 2.7+ on LinuxLinux 上 Python 2.6 和 2.7+ 之间的 Popen 文件描述符差异
【发布时间】:2026-01-03 04:20:05
【问题描述】:

我有一个非常奇怪的问题。我有一些代码需要 Linux 文件描述符 (/dev/fd/N),其中 N 是某个数字。以下示例代码有效地演示了正在执行的操作。

为了运行代码,创建一个名为“/tmp/test”的文件,其中包含一些文本。

代码在 Python 2.6 中工作,但在 Python 2.7 或更高版本中,我得到:

cat: /dev/fd/4: No such file or directory

谁能弄清楚为什么?以下代码需要更改才能在 2.7 及更高版本上运行。假设我无法更改需要的文件描述符(例如 /dev/fd/4):

代码如下:

from subprocess import Popen, PIPE

data = Popen(
    ["cat"],
    stdin=open('/tmp/test', 'rb'),
    stdout=PIPE,
    universal_newlines=True).stdout

fd_name = '/dev/fd/%d' % data.fileno()

fddata = Popen(
    ["cat",
    fd_name],
    stdout=PIPE,
    universal_newlines=True,).stdout

print(fddata.read())

【问题讨论】:

    标签: python python-2.7 subprocess popen python-2.6


    【解决方案1】:

    我不确定为什么这段代码似乎可以在 Python 2.6 上运行,问题基本上是“cat”和您的 Python 代码处于不同的进程中,这些进程在 fd 编号和基础文件之间会有不同的关联。

    要实现为子进程提供文件描述符的特定效果,您需要将该 fd 复制到子进程中。这需要在比 Popen 稍低的级别上与操作系统交互,而且我不知道如何最好地从 Python 中做到这一点。

    也许有一种更简单的方法可以实现您正在寻找的最终目标?您能否向我们提供更多关于您正在尝试解决的问题以及您的代码受到哪些限制的信息?

    【讨论】:

    • 请阅读how to ask帮助页面。包括代码、您尝试过的内容、原始代码(如果有)、您得到或没有得到的结果以及您期望得到的结果。
    最近更新 更多