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.py 和 module.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# 程序开始