我正在编写/试验需要连接到 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 在 Windows 上打开管道时出现 errno 22 似乎表明该管道已被另一个进程使用。
例如:
\\.\pipe\pipe1
作为 VM-A 的 ComPort 进行写入\\.\pipe\pipe1
作为 VM-B 的 ComPort 编写或:
\\.\pipe\pipe1
用于写入\\.\pipe\pipe1
进行阅读\\.\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