无法加载setuptools打包的dll

时间:2019-12-12 16:33:34

标签: python dll setuptools

我在Windows上,将anaconda与python 3和setuptools一起使用。

我在将DLL装入程序包时遇到问题。我尝试遵循“ Packaging resources with setuptools/distribute”和“ Python copy a DLL to site-packages on Windows”中的建议,但似乎缺少一些东西。

所以,我的包裹看起来像:

setup.py
package
|--- __init__.py
|--- main.py
|--- subpackage
     |--__init__.py
     |--foo.py
     |--bar.DLL

我在foo.py里面:

import ctypes

my_dll = ctypes.cdll.LoadLibrary('bar.dll')

当我在控制台中运行脚本时,此方法有效。但是,一旦我将所有内容打包并安装(例如通过setuptools和pip),似乎无法加载dll。

setup.py内,我设置了package_data={'':['*.dll', '*.h', '*.lib']}。安装后,我可以看到所有文件都正确放置在安装位置。尝试导入我的软件包后,出现错误:

File "path\to\subpackage\foo.py", line 3, in <module>
    my_dll = ctypes.cdll.LoadLibrary('bar.dll')
  [...]
OSError: [WinError 126] Das angegebene Modul wurde nicht gefunden
(Could not find the given module)

因此,我很确定,我需要在运行时首先更改dll文件的加载,但我不知道如何。

我正在寻找一种解决方案,该解决方案仍然允许我在编辑器中运行单个文件foo.py,但允许我在安装后在软件包中使用同一文件。

更新为清晰起见进行了编辑。

更新16.12.2019 我发现了另外一件事:

我尝试了以下来自谢尔盖的答案

import os
this_dir = os.path.abspath(os.path.dirname(__file__))

my_dll = ctypes.cdll.LoadLibrary(os.path.join(this_dir, 'bar.dll'))

仅当我当前的工作目录等于...\package\subpackage时,此方法才有效,因此我假设LoadLibrary甚至不尝试搜索给定的路径,而只使用文件名。

1 个答案:

答案 0 :(得分:1)

您的DLL不在PATH中,因此找不到。

Time.TimeScale = 0;内使用importlib.util检索其位置:

foo.py

我没有针对您的特定设置测试此代码,但您应该有一个总体思路

有关import os import importlib.util spec = importlib.util.find_spec('subpackage', 'package') my_dll = ctypes.cdll.LoadLibrary(os.path.join(spec.submodule_search_locations, 'bar.dll')) 的更多信息,请访问documentation


更简单的方法:

find_spec