Я пишу / экспериментирую со сценарием python, который должен подключаться к существующему именованному каналу в Windows 10. Я использую Python 3.8.
Именованный канал
В частности, я пытаюсь подключиться к каналу с именем SendPipe1
и записать в него 14 символов в кодировке ascii.
Канал создан другим программным обеспечением (драйвером?) для устройства, подключенного к моему P C. Я подключаюсь к нему, чтобы попытаться взаимодействовать с устройством так же, как и программное обеспечение, предоставляемое производителем. Программное обеспечение, предоставленное производителем, подключается к этому же каналу и отправляет ему закодированное сообщение, которое предписывает устройству что-то сделать. Это то, что я хотел бы сделать.
Я знаю, что канал уже существует от запуска утилиты 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? Почему этот аргумент неверен? Почему я не могу подключиться к этому каналу и записать в него?
Какой-то другой процесс уже подключен к каналу? Как бы я это проверил? Если есть, как я могу подключиться к устройству одновременно с трубкой?