【问题标题】:Python LoadLibrary not found找不到 Python LoadLibrary
【发布时间】:2017-10-13 13:44:39
【问题描述】:

我正在尝试从 Python 加载 .dll。我将 Python 3.0.17114.1 与 Visual Studio 2017 Preview 一起使用。我收到一条错误消息,提示“NameError:未定义名称 LoadLibrary”。

这是一个代码片段(请注意,DLL 完美无缺):

import ctypes
from ctypes.util import find_library
from ctypes import LibraryLoader
from ctypes.util import find_library    
theDll = find_library('DsiLibrary_dll')
dsi_lib  = LoadLibrary(theDll)

所以我阅读了 LoadLibrary 并且有几种不同的方法可以做到这一点。我尽我所能:

cdll.LoadLibrary(theDll)
CDLL.LoadLibrary(theDll)
ctypes.CDLL.LoadLibrary(theDll)
ctypes.LoadLibrary(theDll)

我是 Python 的新手,所以我可能犯了一些愚蠢的错误。有人可以提个建议吗?

【问题讨论】:

    标签: python loadlibrary


    【解决方案1】:

    您可以像这样访问LoadLibrary

    import ctypes
    from ctypes import cdll 
    from ctypes.util import find_library    
    theDll = find_library('DsiLibrary_dll')
    lib = cdll.LoadLibrary(theDll)
    # do stuff with lib
    

    Ctypes documentation:

    在 Linux 上,需要指定文件名,包括 加载库的扩展名,因此不能使用属性访问 加载库。 dll 加载器的 LoadLibrary() 方法 应该使用,或者您应该通过创建实例来加载库 CDLL 通过调用构造函数:

    >>> from ctypes import *
    >>> cdll.LoadLibrary("libc.so.6") 
    <CDLL 'libc.so.6', handle ... at ...>
    >>> libc = CDLL("libc.so.6")       
    >>> libc
    <CDLL 'libc.so.6', handle ... at ...>
    >>>
    

    【讨论】:

    • 我使用了你的 Windows 方法,但是这给出了相同的未定义错误。
    • 我从您的帖子中进行了剪切和粘贴。从 ctypes 导入 ctypes 从 ctypes.util 导入 cdll 导入 find_library theDll = find_library('DsiLibrary_dll') dsi_lib = cdll.LoadLibrary(theDll)
    • 我不确定您所说的“在线查看”是什么意思。你说的是你给我的剪子吗?也许这是 VS 2017 Preview Python 中的一个错误。你用的是什么 Python?
    • 是的,我在网上看到它,但它不适用于 VS 2017 Preview Python。也许是一个错误。
    • 你把你的文件命名为 ctypes.py 吗?如果没有,你的 python 可能有问题...
    【解决方案2】:

    在使用 Python 3.10.2 x64 的 Win10 PC 上花了 2 天时间解决了同样的问题。 简单代码:

    导入操作系统 导入系统 导入 ctypes

    aqui = os.getcwd() 打印(水) os.add_dll_directory(aqui)

    如果 os.path.exists('LibFT260.dll'): print('找到 LibFT260.dll。') 别的: print('找不到 LibFT260.dll。') 退出()

    ft = ctypes.windll.LoadLibrary('LibFT260.dll')

    打印(ft.FT260_GetChipVersion)

    错误行:ft = ctypes.windll.LoadLibrary('LibFT260.dll') with or w/o '.dll' suffix.
    我将 LibFT260.dll 放在工作目录中(我在其中调用 python 脚本)和 代码将该路径添加到 os.add_dll_directory。这些是 2 互联网上提到的主要修复;都没有用。

    [仅供参考:唯一可行的 ctypes 库加载语句是 ft = ctypes.WinDLL('LibFT260.dll', winmode = 1) Microsoft LoadLibraryEx 文档说不要使用 winmode = 1,它只是为了向后兼容,所以我改为 winmode = 48,这是建议的一种替代方法。 (我从未尝试过 None,但 0 总是失败,所有其他非零都有效。)]

    我在第二台 PC 上运行了与上面完全相同的程序,并且 LoadLibrary() 函数起作用了!

    详情及解决办法:

    机器 2 LoadLibrary() 工作
    联想 P53s x64
    Win10 21H2 build 19044.1526
    Python 3.9.0 (x64)

    机器 1 LoadLibrary() 不工作
    联想 W530 x64
    Win10 20H2 build 19042.1586
    Python 3.10.2 (x64)
    试过 Python 3.9.0 (x64) 还是不行。

    然后我注意到机器之间的许多 Visual C++ 差异。
    P53 安装了更多的 Visual C++ 版本。 当我在 W530 上匹配这些版本时,上面的代码在机器 1 上运行。

    我不知道我拥有哪些版本以及添加了哪些新版本,但这个列表有效: (我现在在机器 1 上同时拥有下面列出的所有 x64 和 x86 版本。)

    Microsoft Visual Studio C++ 版本 2005 Redistributable(MFC 安全更新)
    2008 版(版本 9.0.30729.6161)
    2010 版(10.0.40219 版)
    2013 版(12.0.40664 版)
    版本 2015-2022(版本 14.31.31103)
    所有这些版本在 2022 年 3 月 16 日仍可从 Microsoft 获得。

    我希望这可以帮助其他人解决这个非常令人沮丧的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      相关资源
      最近更新 更多