我在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
甚至不尝试搜索给定的路径,而只使用文件名。
答案 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