зависимости между скомпилированными модулями в python - PullRequest
0 голосов
/ 09 декабря 2011

Допустим, у меня есть два модуля в проекте Python, которые написаны на C ++ и представлены с помощью boost :: python.

#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.Как я могу это исправить?Как я могу определить несколько модулей C в проекте Python и позволить им использовать друг друга?

1 Ответ

1 голос
/ 09 декабря 2011

Поскольку mod1 является расширением Python, чистый подход будет использовать его, как и любой другой модуль Python:

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