0

我在 VS2010 中使用 boost::python 构建了一个 DLL,以将一些函数导出到 python 模块:

我的DLL.cpp:

std::string greet() { return "hello, world"; }
int square(int number) { return number * number; }

BOOST_PYTHON_MODULE(getting_started1)
{
    // Add regular functions to the module.
    def("greet", greet);
    def("square", square);
}

到这里为止,一切都编译得很好。然后我在 c:\myDLL\Debug 中获取 myDLL.dll 和 myDLL.lib 文件。

根据 boost doc (http://wiki.python.org/moin/boost.python/SimpleExample),我需要将它添加到 PYTHONPATH,所以我添加了 c:\myDLL\Debug 到它:PYTHONPATH: C:\Python27 ;c:\myDLL\Debug;

然后,从我的 .py 文件中,我尝试导入它:

import getting_started1
print getting_started1.greet()
number = 11
print number, '*', number, '=', getting_started1.square(number)

我还尝试了 from myDLL import getting_started1 和 from getting_started1 import *,以及所有可能的组合。

谁能告诉我我应该如何调用我的模块?谢谢

编辑:根据 cgohlke 的说法,当我在 VS 中编译时,我的 PYTHONPATH 中应该有一个 getting_started1.pyd 吗?这个文件不存在......我必须在VS2010中设置一些不同的东西吗?我有一个默认的 win32 DLL 项目。但是 boost 文档说“如果我们构建这个共享库并将其放在我们的 PYTHONPATH 上”,Windows 上的共享库不是 DLL 吗?因此,DLL 应该在 PYTHONPATH 中?

4

2 回答 2

2

构建 Python 扩展的标准、可移植的方法是通过distutils。但是,Visual Studio 2010 不是 Python 2.7 支持的编译器。以下 setup.py 对我适用于 Visual Studio 2008 和 boost_1_48_0。构建命令是python setup.py build_ext --inplace.

# setup.py
from distutils.core import setup
from distutils.extension import Extension
setup(name="getting_started1",
    ext_modules=[
        Extension("getting_started1", ["getting_started1.cpp"],
        include_dirs=['boost_1_48_0'],
        libraries = ['boost_python-vc90-mt-1_48'],
        extra_compile_args=['/EHsc', '/FD', '/DBOOST_ALL_DYN_LINK=1']
        )
    ])

对于您的 Visual Studio 2010 项目,尝试将链接器输出文件更改为getting_started1.pyd而不是myDLL.dll.

于 2012-05-31T18:26:18.547 回答
0
  1. 我设法让它只在发布配置中工作,而不是在调试中。
  2. 从项目属性的常规选项卡上,将目标扩展修改为 .pyd
  3. 该项目应该确实是一个dll,就像你做的那样
  4. 在 Python 脚本中,您需要指定 dll 的位置,如下例所示: import sys sys.path.append("d:\\TheProjectl\\bin\\Release") import getting_started #Dll name without extension
于 2013-03-14T07:21:29.197 回答