python中编译模块之间的依赖关系

时间:2011-12-09 09:45:26

标签: c++ python boost-python

假设我在python项目中有两个用C ++编写并用boost :: python公开的模块。

mod1.hpp

#ifndef MOD1_HPP
#define MOD1_HPP

#include <boost/python.hpp>

int square(int x);

#endif

mod1.cpp

#include "mod1.hpp"

using namespace boost::python;

int square(int x)
{
    return x*x;
}

BOOST_PYTHON_MODULE (mod1)
{
    def("square",&square);
}

mod2.hpp

#ifndef MOD2_HPP
#define MOD2_HPP

#include <iostream>
#include <boost/python.hpp>
#include "mod1.hpp"

int myfunc(int x);

#endif

mod2.cpp

#include "mod2.hpp"

using namespace boost::python;

int myfunc(int x)
{
    int y = square(x);
    std::cout << y << std::endl;
}

BOOST_PYTHON_MODULE (mod2)
{
    def("myfunc",&myfunc);
}

如您所见,mod2正在使用mod1中定义的函数。在没有boost :: python包装器和主函数的情况下进行编译,它完全正常。

现在编译脚本

setup.py

#!/usr/bin/python2

from setuptools import setup, Extension

mod1 = Extension('mod1',
                 sources = ['mod1.cpp'],
                 libraries = ['boost_python'])

mod2 = Extension('mod2',
                 sources = ['mod2.cpp'],
                 libraries = ['boost_python'])

setup(name='foo',
      version='0.0',
      description='',
      ext_modules=[mod1,mod2],
      install_requires=['distribute'])

它编译得很好。然后我转到build/lib.linux-i686-2.7并启动python2

>>> import mod1
>>> import mod2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: ./mod2.so: undefined symbol: _Z6squarei
>>> 

显然,mod2找不到mod1存在问题。我该如何解决这个问题?如何在python项目中定义多个C模块并允许它们彼此使用?

1 个答案:

答案 0 :(得分:1)

由于mod1是Python扩展,因此干净的方法就是像使用任何其他Python模块一样使用它:

object mod1 = import("mod1");
object square = mod1.attr("square");
int y = extract<int>(square(x));