在 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 函数。
我正在使用 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 函数。