尝试在 Windows 10 中打开现有命名管道 - errno 22,无效参数,但为什么呢?

问题描述 投票:0回答:1

我正在编写/试验需要连接到 Windows 10 中现有命名管道的 python 脚本。我正在使用 Python 3.8。

命名管道

具体来说,我正在尝试连接到名为

SendPipe1
的管道并向其写入 14 个 ascii 编码字符。

管道是由其他一些软件(驱动程序?)为连接到我的 PC 的设备创建的。我正在连接它以尝试以与制造商提供的软件相同的方式与设备交互。制造商提供的软件连接到同一个管道并向其发送编码消息,命令设备执行某些操作。这就是我想做的。

通过运行 PipeList 实用程序我知道管道已经存在:

PipeList v1.02 - Lists open named pipes
Copyright (C) 2005-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

Pipe Name                                    Instances       Max Instances
---------                                    ---------       -------------
[...]
chrome.blah.foo                                   1                1
SendPipe1                                         1               -1
ReceivePipe1                                      1               -1
chrome.blah.bar                                   1                1
[...]

守则

这是我现在拥有的:

ACTIVE_DISP_ID = 1
msg = f'6;16;100;{ACTIVE_DISP_ID};1\r\n'
pipe_path = f'\\\\.\\PIPE\\SendPipe{ACTIVE_DISP_ID}'

try:
    f = open(pipe_path, 'wb+', buffering=0)
    f.write(msg.encode(encoding='ascii'))
except OSError as e:
    raise

这给了我

错误

Traceback (most recent call last):
  File "C:/Users/Spooqi/PycharmProjects/Spooqi/radiant/pipe-test.py", line 7, in <module>
    f = open(pipe_path, 'wb+', buffering=0)
OSError: [Errno 22] Invalid argument: '\\\\.\\PIPE\\SendPipe1'

我相当确定路径

'\\\\.\\PIPE\\SendPipe1'
是正确的,因为如果我将它更改为类似
'\\\\.\\PIPE\\FooPipeBar'
的东西,我会得到一个不同的异常:

FileNotFoundError: [Errno 2] No such file or directory: '\\\\.\\PIPE\\FooPipeBar'

如果我写入一个(还)不存在相对路径的常规文件

foobar
,它只会正常生成一个包含该消息的文本文件。

问题

在这种情况下,errno 22 是什么意思?为什么这个论点无效?为什么我不能连接到这个管道并写入它?

是否有其他进程已经连接到管道?我将如何检查?如果有,我怎样才能同时用管道连接到设备?

python python-3.x pipe ipc named-pipes
1个回答
0
投票

我没有这方面的来源,但是当从 Python 在 Windows 上打开管道时出现 errno 22 似乎表明该管道已被另一个进程使用。

例如:

  • Hyper-V 打开
    \\.\pipe\pipe1
    作为 VM-A 的 ComPort 进行写入
  • Hyper-V 不能同时打开
    \\.\pipe\pipe1
    作为 VM-B 的 ComPort 编写

或:

  • Hyper-V 打开一个 ComPort
    \\.\pipe\pipe1
    用于写入
  • Program-A 打开 ComPort
    \\.\pipe\pipe1
    进行阅读
  • B程序不能同时打开
    \\.\pipe\pipe1
    阅读

根据管道类型可能还有其他注意事项,但这是我对 Hyper-V 使用单个读取器/写入器命名管道时的错误 22 的观察

使用 Powershell 时,您会看到此错误

PS C:\> $pipe = new-object System.IO.Pipes.NamedPipeClientStream \\.\pipe\pipe1
PS C:\> $pipe.Connect(1)
Exception calling "Connect" with "1" argument(s): "The semaphore timeout period has expired.
"
At line:1 char:1
+ $pipe.Connect(1)
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : IOException

© www.soinside.com 2019 - 2024. All rights reserved.