我正在使用Boost Python库来创建我的C ++代码的python扩展。我希望能够从python中调用下面显示的C ++代码中的'greet'函数:
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
char const* greet()
{
return "hello, world";
}
BOOST_PYTHON_MODULE(hello_ext)
{
using namespace boost::python;
def("greet", greet);
}
和python代码:
import hello_ext
print hello_ext.greet()
我已经设法使用bjam(hello_ext.pyd生成并且它运行良好),但现在我想使用Visual Studio 2008构建它。一个hello.dll被构建(但是没有hello_ext。 dll也不是任何.pyd)。在调用我的python代码后,我收到一个错误:
ImportError:没有名为hello_ext的模块。
将hello.dll重命名为hello.pyd或hello_ext.pyd后,我得到另一个ImportError:Dll加载失败
如何使用VS 2008构建正确的.pyd文件?
答案 0 :(得分:10)
首先,确保您只尝试从Python导入发布版本;导入调试版本将失败,因为运行时库版本不匹配。我还更改了我的项目属性,以便发布版本输出.pyd文件:
属性&gt;&gt;链接器&gt;&gt;输出:
$(OutDir)\$(ProjectName).pyd
(我还创建了一个构建后的动作来从python运行单元测试)
接下来,请确保在stdafx.h文件中定义以下内容:
#define BOOST_PYTHON_STATIC_LIB
最后,如果您安装了多个python版本,请确保导入正确版本的python.h(在工具&gt;&gt;选项&gt;&gt;项目和解决方案&gt;&gt; VC ++目录中&gt;&gt;包含文件)。
答案 1 :(得分:5)
错误 ImportError:Dll加载失败通常意味着.pyd模块依赖于无法找到的其他DLL - 通常是 msvc * .dll 。您可能想尝试在记事本中打开.pyd文件并搜索“.dll”。然后检查目录或PATH中是否存在所有DLL依赖项。
或者使用Dependency Walker来找到缺少的依赖项
答案 2 :(得分:1)
即使这是几年前发布的问题(仍然不容易找到解决方案),但我今天遇到了同样的问题,经过几个小时的搜索,我终于找到了一个可行的解决方案。
所以,我所做的就是复制这个文件,然后将其粘贴到 .pyd 文件夹下,然后我的python就可以正确导入我构建的项目了。
也许有一些其他解决方案,即构建您的项目不依赖于动态库,而是使用静态库。有些人说要在VS预处理器中定义 BOOST_PYTHON_STATIC_LIB ,那么你的项目将不依赖于动态库(我是一个新的C ++ er),但要确保你已经构建了 libboost_python- vcXXX-mt-1_58.dll 在boost。
答案 3 :(得分:0)
请确保您拥有标记-lpython26
(如果您使用的是python2.6),并且文件名应为hello_ext.pyd
。