gpt4 book ai didi

python - Python打开命名管道字符设备专用文件进行读写的方法

转载 作者:IT王子 更新时间:2023-10-29 00:57:22 25 4
gpt4 key购买 nike

我有一个在 Linux 机器上运行的服务,它创建一个 命名管道 字符设备专用文件,我想编写一个 Python3 程序,通过编写文本命令和读取文本与该服务通信来自 pipe 设备的回复。我没有该服务的源代码。

我可以使用 os.open(named_pipe_pathname, os.O_RDWR),我可以使用 os.read(...)os.write (...) 来读取和写入它,但这很痛苦,因为我必须编写自己的代码来在字节和字符串之间进行转换,我必须编写自己的 readline(...) 函数等

我更愿意使用 Python3 io 对象来读取和写入 pipe 设备,但是我能想到的每一种创建方法都会返回相同的错误:

io.UnsupportedOperation: File or stream is not seekable.

例如,如果我尝试 open(pathname, "r+"),我会收到该消息,如果我尝试 fd=os.open(... ) 后跟 os.fdopen(fd, "r+", ...)

问:Python3 程序向命名管道字符设备写入和读取文本的首选方式是什么?


编辑:

糟糕!我假设我正在处理命名管道,因为该服务的文档将其描述为“管道”,并且因为它在用户模式服务运行之前不会出现在文件系统中。但是,Linux file 实用程序说它实际上是一个字符设备特殊文件。

最佳答案

出现此问题是因为尝试在读写模式下使用 io.open 隐式尝试将底层文件包装在 io.BufferedRandom 中(然后包装在 io.TextIOWrapper if in text mode),它假设底层文件不仅是读/写的,而且是随机访问的,并且它基于此采取自由(隐式寻求)。有一个单独的类,io.BufferedRWPair,用于读/写管道(文档字符串特别提到它用于套接字和双向管道)。

您可以通过手动逐层包装来模拟 io.open 的效果,以产生相同的最终结果。具体来说,对于文本模式包装器,您可以执行以下操作:

rawf = io.FileIO(named_pipe_pathname, mode="rb+")
with io.TextIOWrapper(io.BufferedRWPair(rawf, rawf), encoding='utf-8', write_through=True) as txtf:
del rawf # Remove separate reference to rawf; txtf manages lifetime now
# Example use that works (but is terrible form, since communicating with
# oneself without threading, select module, etc., is highly likely to deadlock)
# It works for this super-simple case; presumably you have some parallel real code
txtf.write("abcé\n")
txtf.flush()
print(txtf.readline(), flush=True)

我相信这会在 txtf 关闭时关闭 rawf 两次,但幸运的是,这里两次关闭是无害的(第二次 close 确实没什么,意识到它已经关闭了)。

关于python - Python打开<del>命名管道</del>字符设备专用文件进行读写的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48431413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com