如何在Python中打开命名的pipecharacter设备专用文件进行读写

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

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

我宁愿使用Python3 io对象来读取和写入管道设备,但我能想到的每一种方法都会返回相同的错误

io.UnsupportedOperation: File or stream is not seekable.

例如,如果我尝试打开(路径名,“r”),我会收到该消息,如果我尝试fd = os.open(…)后跟os.fdopen(fd,“r”,我得到相同的消息) …).

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

编辑:

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

最佳答案
出现此问题是因为尝试在读写模式下使用io.open会隐式尝试将基础文件包装在io.BufferedRandom中(如果在文本模式下,则将其包装在io.TextIOWrapper中),这假定基础文件不仅被读取/ write,但随机访问,它基于此需要自由(寻求隐式).有一个单独的类io.BufferedRWPair,用于读/写管道(docstring特别提到它用于套接字和双向管道).

您可以通过逐层手动包装来模仿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两次,但幸运的是,双关闭在这里是无害的(第二次关闭什么也没做,意识到它已经关闭).

相关文章

文件查找(find) 1 find 简单的说,就是实时查找指定的内容或条件。特点:最新、最快、最准确。 用法:...
非交互式添加分区 方法一 添加/deb/sdb 下的分区,其实位置为1到1000M,第二个分区位置为1001至3000M,...
编译安装httpd 1 去官网下载源码包 为避免非法软件,一定要去官网下载http://www.apache.org httpd-2.4...
gdisk用法 gdisk - InteractiveGUIDpartitiontable (GPT) manipulator GPTfdisk (akagdisk) isatext-mo...
1 一定用快捷键 这里简单的说下几个常用的快捷按键。 1.1 移动光标快捷键 Crtl + a 光标回到命令行...
bash shell中测试命令 test命令提供了if-than语句中测试不同条件的途径。如果test命令中列出的条件成立...