显然在Cygwin上使用ctypes
有一个不好的副作用,即不能将主机操作系统识别为正在使用Windows,因此Python解释器无法使用/导入常用的Window(API)特定的DLL加载器,例如:
from ctypes import WinDLL
import wintypes
import msvcrt
原因是导入机制正在使用sys.platform
检查 win32
,但是收到cygwin
,并认为它在另一个操作系统上,因此禁用任何与Windows相关的导入。
正如我在this answer中提到的那样,您可以使用cdll
加载程序从 ctypes 导入DLL,但我不知道这是否正确,有什么区别使用windll
。
是否可以在Cygwin上侧面加载windll
(或wintypes, msvcrt
)ctypes库?
(令人遗憾的是Cygwin,ctypes和python维护人员甚至在first reported已有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)
附录
在这种用例中,我们可能不尝试使用 wintypes 库。如python ctypes docs中所述:
注意:通过
cdll.msvcrt
访问标准C库将使用 库的过时版本可能与该库不兼容 被Python使用。 尽可能使用本机Python功能, 否则,导入并使用msvcrt
模块。