有没有其他方法可以在Cygwin中导入ctypes.wintypes?

时间:2018-12-14 14:12:59

标签: python winapi cygwin ctypes

显然在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模块。

0 个答案:

没有答案