Попытка открыть существующий именованный канал в Windows 10 - errno 22, неверный аргумент, но почему? - PullRequest
3 голосов
/ 21 февраля 2020

Я пишу / экспериментирую со сценарием 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? Почему этот аргумент неверен? Почему я не могу подключиться к этому каналу и записать в него?

Какой-то другой процесс уже подключен к каналу? Как бы я это проверил? Если есть, как я могу подключиться к устройству одновременно с трубкой?

...