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

最佳答案

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

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'))


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

关于find_spec的更多信息位于documentation



更简单的方法:

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

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

关于python - 无法加载与setuptools打包在一起的dll,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59309035/

10-11 22:25
查看更多