在 python2.7 中的命名管道上使用 os.open() 和 .read() 会导致 AttributeError

Using os.open() and .read() on a named pipe in python2.7 results in AttributeError

我正在使用 Python2.7,我的操作系统是 Ubuntu14.04。

在我的 python 代码中,我使用 fifo = os.open('fifo', os.O_NONBLOCK | os.O_RDONLY) 打开命名管道。然后我使用 string = fifo.read(7) 从该管道中读取七个字符。在 运行 编写代码之前,我在命令行中使用 mkfifo fifo 创建了管道。当我尝试 运行 代码时,出现以下错误:

Traceback (most recent call last):
  File "test.py", line 19, in <module>
    string = fifo.read(7)
AttributeError: 'int' object has no attribute 'read'

为什么会发生这种情况,我该如何解决?

如果需要更多详细信息:
我正在使用 fifo 将答案集编程 (ASP) 文件的输出通过管道传输到我的 python 代码中的字符串中。 python 文件的输出正在通过管道传输到 ASP 文件的输入(运行ning 在查询模式下)。因此,python 向 ASP 发送查询,响应被放入 fifo 管道,python 将该响应读入字符串。

我使用 O_NONBLOCK 的原因是没有它执行会停滞,但我不知道为什么,因为我很确定 ASP 文件正在写入 fifo;我使用文本文件而不是 fifo 测试了类似的方法,ASP 输出肯定会进入文本文件。

我正在 运行使用命令 python pythonfile.py | java -jar sparc.jar aspfile.sp > fifo 调整我的代码。

如果您需要更多信息,请在评论中通知我,我将 post 我的代码。感谢您提供任何建议。

os.open 对应底层 C 库的 open(3) 调用。它returns一个文件描述符,它只是一个整数索引(对应的C类型是int)。

要使用文件描述符,只需使用os.write/os.read,或通过os.fdopen将其包装在文件对象中。您不能在 上调用 read 方法 ,因为文件描述符只是一个 Python 整数,并且没有针对整数的 read 方法。

参考:Python os 的库参考和第 3 节中的 Unix C 手册页。

P.S。要创建命名管道,只需使用 os.mkfifo。无需分叉外部命令。 os 模块包装了大多数 POSIX I/O 函数。