发布于2019-10-31 08:48 阅读(1340) 评论(0) 点赞(17) 收藏(2)
我在运行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.
例如,如果我尝试该消息,则open(pathname, "r+")
得到该消息;如果我尝试fd=os.open(...)
之后,则得到该消息os.fdopen(fd, "r+", ...)
。
问:Python3程序在与 命名管道 角色设备?
编辑:
糟糕!我以为我正在处理命名管道,因为该服务的文档将其描述为“管道”,并且因为直到用户模式服务运行,该管道才出现在文件系统中。但是,Linux file
实用程序说它实际上是一个字符设备专用文件。
发生问题是因为尝试io.open
在读写模式下使用时会隐式尝试将基础文件io.BufferedRandom
打包(io.TextIOWrapper
如果在文本模式下,则将其打包),这假定基础文件不仅是读/写的,而且是随机访问的,而且基于此获得自由(隐式寻求)。有一个单独的类,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)
我相信关闭rawf
时会关闭两次txtf
,但是幸运的是,双重关闭在这里是无害的(第二次close
不执行任何操作,意识到它已经关闭了)。
作者:黑洞官方问答小能手
链接:https://www.pythonheidong.com/blog/article/147947/fc16fedb1cd58f6d80fc/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!