Python 和 Windows 命名管道

2023-11-22

从 Python 与 Windows 上的命名管道进行通信的正确方法是什么?我用谷歌搜索了一下,找不到任何包装此通信的包。

有:

  • 关于如何使用 pywin32 执行此操作的一些描述(不过,我找不到如何使用它连接到现有管道)。
  • 这个包:https://pypi.python.org/pypi/PyWPipe/(也没有运气)
  • 这里有一段代码,我还没有测试过:http://jonathonreinhart.blogspot.ru/2012/12/named-pipes- Between-c-and-python.html

我只需要连接到现有的命名管道并对其进行读/写。我以前只尝试过与串行端口进行通信(使用 pySerial),令我惊讶的是,与它相比,我在命名管道上找到的信息很少。通常有大量针对任何目的的 Python 指南。

我将不胜感激任何帮助。


为了连接到现有的命名管道,您可以使用CreateFileAPI 通过提供pywin32包裹。由于我花了一段时间才将工作基础放在一起,这里有一个示例客户端/服务器,它对我来说效果很好(Windows 10 Pro x64 上的 python 3.6.5、pywin32 223):

import time
import sys
import win32pipe, win32file, pywintypes


def pipe_server():
    print("pipe server")
    count = 0
    pipe = win32pipe.CreateNamedPipe(
        r'\\.\pipe\Foo',
        win32pipe.PIPE_ACCESS_DUPLEX,
        win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_READMODE_MESSAGE | win32pipe.PIPE_WAIT,
        1, 65536, 65536,
        0,
        None)
    try:
        print("waiting for client")
        win32pipe.ConnectNamedPipe(pipe, None)
        print("got client")

        while count < 10:
            print(f"writing message {count}")
            # convert to bytes
            some_data = str.encode(f"{count}")
            win32file.WriteFile(pipe, some_data)
            time.sleep(1)
            count += 1

        print("finished now")
    finally:
        win32file.CloseHandle(pipe)


def pipe_client():
    print("pipe client")
    quit = False

    while not quit:
        try:
            handle = win32file.CreateFile(
                r'\\.\pipe\Foo',
                win32file.GENERIC_READ | win32file.GENERIC_WRITE,
                0,
                None,
                win32file.OPEN_EXISTING,
                0,
                None
            )
            res = win32pipe.SetNamedPipeHandleState(handle, win32pipe.PIPE_READMODE_MESSAGE, None, None)
            if res == 0:
                print(f"SetNamedPipeHandleState return code: {res}")
            while True:
                resp = win32file.ReadFile(handle, 64*1024)
                print(f"message: {resp}")
        except pywintypes.error as e:
            if e.args[0] == 2:
                print("no pipe, trying again in a sec")
                time.sleep(1)
            elif e.args[0] == 109:
                print("broken pipe, bye bye")
                quit = True


if __name__ == '__main__':
    if len(sys.argv) < 2:
        print("need s or c as argument")
    elif sys.argv[1] == "s":
        pipe_server()
    elif sys.argv[1] == "c":
        pipe_client()
    else:
        print(f"no can do: {sys.argv[1]}")

输出客户端示例

> python pipe_test.py c
pipe client
no pipe, trying again in a sec
no pipe, trying again in a sec
no pipe, trying again in a sec
message: (0, b'0')
message: (0, b'1')
message: (0, b'2')
message: (0, b'3')
message: (0, b'4')
message: (0, b'5')
message: (0, b'6')
message: (0, b'7')
message: (0, b'8')
message: (0, b'9')
broken pipe, bye bye

输出服务器示例

> python pipe_test.py s
pipe server
waiting for client
got client
writing message 0
writing message 1
writing message 2
writing message 3
writing message 4
writing message 5
writing message 6
writing message 7
writing message 8
writing message 9
finished now

显然,您需要对各种调用进行一些错误检查,但这应该可行。

附注:我的一位同事遇到了问题,当客户端尝试对其执行 I/O 时,管道被关闭(异常声称“所有管道实例都忙”)。原来他用的是os.path.exists在客户端代码中测试运行前命名管道是否已经存在CreateFile在上面。这不知何故打破了管道。所以使用上面的方法(CreateFile包装在 try-except 中)是尝试连接到管道直到服务器端创建管道的安全方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 和 Windows 命名管道 的相关文章

随机推荐

  • 将浮点数转换为字符串的最快 C++ 方法

    我遇到了将浮点数转换为字符串的问题to string对我来说太慢了 因为我的数据可能涉及几百万个浮点数 我已经有了解决方案如何快速写出这些数据 然而 在解决这个问题之后 我很快意识到浮点到字符串的转换正在留下很大的影响 那么 除了使用其他非
  • SVG 中的 HTML

    我想在一个文件中添加一些 HTML 标记SVG绘画 据我所知 这是不可能的SVG 图像显示在浏览器中 有没有办法画HTML上面的SVG 因为我想使用CSS table特点HTML the SVG
  • 如何以编程方式创建给定网站的屏幕截图?

    我希望能够创建给定网站的屏幕截图 但该网站可能大于屏幕上可以查看的大小 我有办法做到这一点吗 目标是在 WinForms 应用程序中使用 C 中的 NET 来完成此操作 有一些工具 问题是 您需要在某个给定的程序中渲染它 并拍摄它的快照 我
  • Eclipse 选项卡损坏了如何修复?

    我刚刚下载了 eclipse 但它显示的语言是错误的 我该如何解决这个问题 这是由 Windows 中的字体设置引起的 它描述于thisEclipse 错误报告 由于不是 Eclipse 错误而关闭 您应该能够在 Eclipse 中通过更改
  • CakePHP 中的模型可以有多个表吗?

    CakePHP 中的模型可以有多个表吗 从说明书上这句话猜测 模型通常是数据库的访问点 更具体地说 是数据库中某个表的访问点 默认情况下 每个模型都使用其名称的复数形式的表 即 User 模型使用 users 表 我不这么认为 但你可以建立
  • PHP 中参数类型可以特化吗

    假设我们有以下两个类 abstract class Foo public abstract function run TypeA object class Bar extends Foo public function run TypeB
  • 如何自动缩放字体大小以适应 div 的内容?

    我有一个带有一些文本的 div div style width 50px With some text in it div 如何缩放文本的字体大小以使所有文本都可见 反之亦然 您可以将文本包装在内部 DIV 中 并使用 JavaScript
  • 有关 Azure 实例分配带宽的问题

    我从 Azure 了解到一些事实 每个实例的带宽有限 例如 Extra Small 实例有 5Mb s 我们只支付出站带宽 入站免费 同一个数据中心 流量免费 即使对于小实例 我检查了网络接口 连接速度为10G 因此分配的带宽始终低于网络接
  • 使用通知模式进行域验证

    从历史上看 我在对象的构造函数中对对象进行了验证 并在验证失败时抛出异常 例如 class Name const MIN LENGTH 1 const MAX LENGTH 120 private value public function
  • Idris:是否可以使用“with”重写所有函数以使用“case”而不是“with”?如果不是,能举个反例吗?

    在 Idris 中 是否可以使用 重写所有函数 with 使用 case 而不是 with 如果不是 能举个反例吗 不可能 当你模式匹配时with 上下文中的类型将使用从匹配的构造函数中提取的信息进行更新 case不会导致此类更新 例如 以
  • Ninject 3 InRequestScope 未针对同一请求返回同一实例

    最近 我将我的一个 MVC3 项目从 Ninject 2 升级到 Ninject 3 经过几分钟尝试找出 InRequestScope 不再可用的原因 我发现它现在是 Ninject Web Common 的扩展 现在 当我尝试运行应用程序
  • Java中如何比较字符串和枚举类型?

    我有美国所有州的枚举列表 如下所示 public enum State AL AK AZ AR WY 在我的测试文件中 我将从包含状态的文本文件中读取输入 由于它们是字符串 我如何将它与枚举列表的值进行比较 以便为我设置的变量赋值 priv
  • 如何防止此错误:警告:mysql_fetch_assoc() 期望参数 1 为资源,布尔值在...第 11 行给出[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 错误 mysql fetch array 期望参数 1 为资源 给定布尔值 我对这个错误感到非常困惑 当我尝试从不存在的数据库返回结果时它会显示 我尝试过mysql num rows 但它返回
  • 在 Fortran 中强制将 Intent(in) 声明的变量作为常量,也在被调用的子例程/函数中执行

    在子例程或函数中 可以使用intent in 定义输入变量 并且编译器确保在子例程内该变量不能被更改 一旦变量被传递 通过引用 到另一个子例程 该子例程就能够更改变量而不会出现编译器警告 这是用 gfortran 测试的 代码如下 prog
  • java 中的 System.exit(0)

    我正在使用 swing 编写一个应用程序 我需要通过单击退出应用程序JButton为此我可以使用System exit 或者我应该使用其他一些方法 这是最佳实践 如果打电话System exit 不是最佳实践 然后告诉原因并告诉退出应用程序
  • 这里的文档和双反斜杠

    如果我在包含多个反斜杠 的 shell 脚本中使用此处文档 则 shell 会将其转换为单个反斜杠 我可以在不更改文本的情况下解决这个问题吗 cat lt
  • Spark:线程“主”org.apache.spark.sql.catalyst.errors.package中出现异常

    运行我的 Spark submit 代码时 我在执行时收到此错误 执行连接的 Scala 文件 我只是想知道这个 TreeNodeException 错误是什么 为什么我们会出现这个错误 请分享您对此 TreeNodeException 错
  • 将 dll 文件添加到 C# 项目

    这是一个初学者的问题 但是 项目文件中包含的 dll 引用和 dll 的图像 http a3 vox com 6a00c2251e5b66549d00e398ca81eb0003 pi 如果您查看上图 会发现 Bass Net dll 添加
  • 使用 Cordova/jQuery-mobile 在外部设备浏览器中打开链接

    我的应用程序中有很多链接 我添加了rel external target blank 对他们所有人 在 Ripple 模拟器或常规桌面浏览器中 这效果很好 但在我的 Android JB 4 2 2 上 它会在同一窗口中打开链接 点击 返回
  • Python 和 Windows 命名管道

    从 Python 与 Windows 上的命名管道进行通信的正确方法是什么 我用谷歌搜索了一下 找不到任何包装此通信的包 有 关于如何使用 pywin32 执行此操作的一些描述 不过 我找不到如何使用它连接到现有管道 这个包 https p