Есть ли альтернативный способ импортировать ctypes.wintypes в Cygwin? - PullRequest
0 голосов
/ 14 декабря 2018

Очевидно, что использование ctypes в Cygwin имеет неприятный побочный эффект: он не распознает хост-ОС как использующую Windows, поэтому интерпретатор Python не может использовать / импортировать часто используемые загрузчики DLL для Windows (API), такие как:

from ctypes import WinDLL
import wintypes
import msvcrt

Причина в том, что механизм импорта использует sys.platform для проверки win32, но получает cygwin и думает, что это на другой ОС и поэтому отключает все связанные с Windowsimport.

Как я уже упоминал в в этом ответе , вы можете импортировать DLL, используя загрузчик cdll из ctypes , но я понятия не имею, верно ли этои в чем отличие от использования windll.

Есть ли способ загружать библиотеки ctypes windll (или wintypes, msvcrt) на Cygwin?

(Очень жаль, что Cygwin, ctypes и сопровождающие python не выяснили, что делать в этом случае, даже после 6+ лет того, как впервые сообщили .)


Для справки, когдапытаясь импортировать wintypes, вы получаете:

>>> from ctypes import wintypes
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/ctypes/wintypes.py", line 20, in <module>
    class VARIANT_BOOL(ctypes._SimpleCData):
ValueError: _type_ 'v' not supported

Где ошибочные строки находятся в wintypes.py:

class VARIANT_BOOL(ctypes._SimpleCData):
    _type_ = "v"
    def __repr__(self):
        return "%s(%r)" % (self.__class__.__name__, self.value)

ADENDUM

Вероятно, нам следует не пытаться использовать библиотеки wintypes в этом случае использования.Как указано в python ctypes docs :

Примечание: При доступе к стандартной библиотеке C через cdll.msvcrt будет использоваться устаревшая версия библиотеки, которая можетбыть несовместимым с тем, который используется Python. Где возможно, используйте встроенные функции Python или импортируйте и используйте модуль msvcrt.

...