Sol*_*low 6 python linux python-3.x
我有一个在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.
Run Code Online (Sandbox Code Playgroud)
例如,如果我尝试的话open(pathname, "r+"),我会收到该消息,如果我尝试fd=os.open(...)后跟,我会收到相同的消息os.fdopen(fd, "r+", ...).
问:Python3程序在文本中写入和读取文本的首选方法是什么? 命名管道 角色设备?
编辑:
哎呀!我假设我正在处理一个命名管道,因为该服务的文档将其描述为"管道",因为它在用户模式服务运行之前不会出现在文件系统中.但是,Linux file实用程序说它实际上是一个字符设备特殊文件.
io.open出现该问题的原因是尝试在读写模式下使用隐式尝试将底层文件包装起来io.BufferedRandom(然后io.TextIOWrapper在文本模式下将其包装在 if 中),这假定底层文件不仅是读/写的,而且是随机访问的,并且它在此基础上采取自由行动(隐含地寻求)。有一个单独的类,io.BufferedRWPair旨在与读/写管道一起使用(文档字符串特别提到它用于套接字和双向管道)。
io.open您可以通过手动逐层包裹来模拟效果,以产生相同的最终结果。具体来说,对于文本模式包装器,您需要执行以下操作:
rawf = io.FileIO(named_pipe_pathname, mode="rb+")\nwith io.TextIOWrapper(io.BufferedRWPair(rawf, rawf), encoding=\'utf-8\', write_through=True) as txtf:\n del rawf # Remove separate reference to rawf; txtf manages lifetime now\n # Example use that works (but is terrible form, since communicating with\n # oneself without threading, select module, etc., is highly likely to deadlock)\n # It works for this super-simple case; presumably you have some parallel real code\n txtf.write("abc\xc3\xa9\\n")\n txtf.flush()\n print(txtf.readline(), flush=True)\nRun Code Online (Sandbox Code Playgroud)\n\n我相信这会在关闭rawf时关闭两次txtf,但幸运的是,双重关闭在这里是无害的(第二个close什么都不做,意识到它已经关闭了)。