Python:C++ 的包装器需要访问 .dll 文件

Posted

技术标签:

【中文标题】Python:C++ 的包装器需要访问 .dll 文件【英文标题】:Python: wrapper for C++ requires access to .dll files 【发布时间】:2015-05-20 01:10:43 【问题描述】:

我为使用 SWIG 用 C++ 编写并在 Windows 7 中使用 Microsoft Visual Studio 2010 构建的 SDK 制作了 Python 包装器。

这很成功,生成了 module.py_module.pyd。然而,这个包装器在很大程度上依赖于 PythonXY 文件夹之外的 SDK 文件夹中的几个 .dll 文件。

在我将 module.pymodule.pyd 移动到 PythonXY/Lib/site-packages/ 后,并尝试运行 import module,出现如下错误:

ImportError: DLL load failed: The specified module could not be found.

然后,我尝试使用 Python 模块 os 中的 os.chdir() 方法将 Python 工作目录更改为 .dll 文件所在的目录。这一次,运行 import module 输出没有错误。我继续访问封装的 C++ 类和函数,它们工作得很好。

我的问题是:

如何“链接”包含 .dll 文件的路径,以便每当我想使用 模块 时,我都不必更改工作目录? 除了 Python 源文件中的 Python 默认工作目录之外,还有什么方法可以附加其他工作目录? (即不是来自 Windows 上的 PATH 配置) 有什么方法可以将包装器与这些 .dll 文件动态链接?这意味着假设文件被复制到另一台机器并且 .dll 文件存储在不同的绝对路径目录中,导入模块仍然可以工作吗?

关键是我想让这个包装器尽可能地便携,跨多个 Windows 机器。

谢谢。

【问题讨论】:

你试过把它放在 Windows 会寻找 DLL 的地方吗? 如何检查 Windows 会在哪些目录中查找 DLL? 【参考方案1】:

我找到了一个解决方案,让module.py找到_module.pyd

基本上,创建一个名为 module.pth 的新文件并将其保存在与 module.py 相同的目录中。在这种情况下,目录是 PythonXY/Lib/site-packages/。

假设您将 _module.pyd 放在名为 _modulelib (PythonXY/Lib/site-packages/_modulelib/) 的目录中,然后是 的内容module.pth 应该是这样的:

_modulelib

【讨论】:

以上是关于Python:C++ 的包装器需要访问 .dll 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将 C++ dll 静态链接到 .NET 库(将 c++ dll 构建到网络包装器 dll 以获取一个 dll)

MFC dll 中的访问冲突(用 C++/CLI 包装)从 C# 程序开始

casmcard 包装器

用于 C++ 的 C# 包装器,但仅编译为静态库

通过在 C++ 接口周围创建 C 包装器,在 FORTRAN 中调用 C++ dll 文件 [关闭]

从 C# 调用 C++ dll 方法/类