Очевидно, что использование 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
.