Я пытаюсь сделать pty pipe. Для этого я должен использовать функцию CreatePseudoConsole
из Windows API. Я свободно копирую это, которое это, но на питоне.
Я не знаю, актуально ли это, но я использую Python 3.7.9 и Windows 10.
Это мой код:
from ctypes.wintypes import DWORD, HANDLE, SHORT
from ctypes import POINTER, POINTER, HRESULT
import ctypes
import msvcrt
import os
# The COORD data type used for the size of the console
class COORD(ctypes.Structure):
_fields_ = [("X", SHORT),
("Y", SHORT)]
# HPCON is the same as HANDLE
HPCON = HANDLE
CreatePseudoConsole = ctypes.windll.kernel32.CreatePseudoConsole
CreatePseudoConsole.argtypes = [COORD, HANDLE, HANDLE, DWORD, POINTER(HPCON)]
CreatePseudoConsole.restype = HRESULT
def create_console(width:int, height:int) -> HPCON:
read_pty_fd, write_fd = os.pipe()
read_pty_handle = msvcrt.get_osfhandle(read_pty_fd)
read_fd, write_pty_fd = os.pipe()
write_pty_handle = msvcrt.get_osfhandle(write_pty_fd)
# Create the console
size = COORD(width, height)
console = HPCON()
result = CreatePseudoConsole(size, read_pty_handle, write_pty_handle,
DWORD(0), ctypes.byref(console))
# Check if any errors occured
if result != 0:
raise ctypes.WinError(result)
# Add references for the fds to the console
console.read_fd = read_fd
console.write_fd = write_fd
# Return the console object
return console
if __name__ == "__main__":
consol = create_console(80, 80)
print("Writing...")
os.write(consol.write_fd, b"abc")
print("Reading...")
print(os.read(consol.read_fd, 1))
print("Done")
Проблема в том, что он не может читать из канала. Я ожидал, что он напечатает "a"
, но он просто застрял на os.read
. Обратите внимание, что я впервые использую WinAPI, поэтому проблема, скорее всего, в нем.
CreatePseudoConsole
довольно новая (с 2018 года), и поэтому у меня так много проблем с ней. Думаю, со мной все будет хорошо, так как вряд ли я перейду на другие версии Windows. Есть ли у вас какие-либо идеи относительно того, что может быть причиной моей проблемы? - person TheLizzard   schedule 29.03.2021os.pipe
в python, но я думаю, что проблема вызвана дескриптором чтения и записи канала, возможно, вы можете обратиться к: Не удается ввести данные в новую консоль как дочерний процесс в c - person Song Zhu   schedule 30.03.2021os
. Это все еще не работает. - person TheLizzard   schedule 30.03.2021ReadFile
, я думаю, вы можете обратиться к: Мы отследили канал, и он идет изнутри процесса!. И, судя по официальному образцу, CreatePseudoConsole` не устанавливает связь между двумя каналами. Так почему же необходимо использовать этот API? - person Song Zhu   schedule 31.03.2021argtypes
, а неargtype
. - person user3840170   schedule 04.04.2021ctypes
выполняет проверку типов и/или преобразования на их основе. Даже если не критично, думаю стоит исправить. - person user3840170   schedule 04.04.2021read_pty_fd
иwrite_fd
, а подчиненная сторонаread_fd
иwrite_pty_fd
? Из моей функции я возвращаюread_fd
иwrite_fd
. Кроме того, именно так они а> сделай это. Исправление орфографической ошибки ничего не дало. - person TheLizzard   schedule 04.04.2021read_fd
иwrite_fd
, а подчиненная сторона — этоread_pty_fd
иwrite_pty_fd
; последние два преобразуются в паруHANDLE
и как таковые передаются в вызовCreatePseudoConsole
. - person user3840170   schedule 04.04.2021CreatePseudoConsole
и куда я должен читать/писать? - person TheLizzard   schedule 04.04.2021CreatePseudoConsole
в порядке. Вы передаете полученный от него дескрипторHPCON
дочернему процессу (как говорят вам ссылки MSDN), чтобы подключить его к ведомой стороне, в то время как вы используетеread_fd
иwrite_fd
для связи с ним на ведущей стороне. - person user3840170   schedule 04.04.2021