Использование кода, сгенерированного Py ++, в качестве расширения Python - PullRequest
5 голосов
/ 31 января 2010

Мне нужно обернуть существующую библиотеку C ++ для использования в Python. Прочитав этот ответ о выборе подходящего метода для переноса C ++ для использования в Python , я решил использовать Py ++.

Я прошел учебник для Py ++ , используя файлы учебника, и получил ожидаемый результат в generated.cpp, но я не понял, что делать, чтобы фактически использовать сгенерированный код в качестве расширения я могу импортировать в Python. Я уверен, что сейчас мне нужно скомпилировать код, но с чем? Я должен использовать bjam ?

Ответы [ 3 ]

6 голосов
/ 31 января 2010

Py ++ генерирует синтаксис, который вы используете, вместе с boost :: python для генерации точек входа python в вашем приложении. Предполагая, что с Py ++ все прошло хорошо, вам нужно скачать среду Boost и добавить в свой проект каталог Boost Boost и библиотеку boost :: python, а затем скомпилировать сгенерированный Py ++ cpp.

Вы можете использовать любую систему сборки, какую захотите, для своего проекта, но boost собран с помощью bjam. Вам нужно выбрать, хотите ли вы статическую библиотеку или библиотеку Python с динамическим бустом, а затем следуйте инструкциям по созданию буста здесь .

Если в Windows вам нужно изменить расширение вашей встроенной библиотеки с .dll на .pyd. И да, это должен быть проект библиотеки, это не работает с исполняемыми файлами.

Затем разместите pyd там, где питон на вашем компьютере сможет его найти, и перейдите в python и выполните import [Your-library-name], и, надеюсь, все будет работать.

Последнее замечание, имя, указанное в файле generate.cpp в этом макросе:

BOOST_PYTHON_MODULE( -name- )

должно быть точным названием вашего проекта, иначе python будет жаловаться.

Я только что прошел все это меньше месяца назад, поэтому я знаю о путанице.

Одна вещь, которую я сделал, чтобы сделать моё расширение python очень простым в использовании при сборке библиотеки и тестировании, заключалась в том, чтобы самостоятельно собрать boost :: python и python в моей среде сборки. Таким образом, pyd заканчивается именно там, где я хочу, и пользователям не нужно устанавливать python для запуска с моим расширением. Это может быть излишним для того, что вы делаете, хотя.

Edit: Если вы хотите, чтобы ваше расширение было легко установлено и скомпилировано на компьютере, посмотрите setuptools в python. С помощью всего лишь нескольких простых строк вы можете скомпилировать и установить пакет для Python. Один недостаток - несовместимость с IDE для тех из нас, кому нравится разрабатывать в visual studio.

4 голосов
/ 01 февраля 2010

Следующий ответ мне дал Роман Яковенко из списка рассылки Python C ++ - sig ; Я публикую его здесь с небольшими изменениями для сообщества Stack Overflow.

Я еще не полностью понял ответ, но я чувствовал, что он направляет меня в правильном направлении.

<ч />

После того, как вы сгенерировали код, вы должны скомпилировать его. Для этого вы можете использовать вашу любимую систему сборки. Я использую BJAM только для компиляции Boost. После этого я предпочитаю использовать scons (в Windows и в Linux).

Ниже приведен пример файла sconstruct, который используется для компиляции одного из тестов модулей Py ++ (это тоже сгенерированный код :-)):

import sys
env = Environment()

if 'linux' not in sys.platform:
   env['MSVS'] = {'VERSION': ''}
   env['MSVS_VERSION'] = ''
   Tool('msvc')(env)

t = env.SharedLibrary(
    target=r'abstract_classes',
    source=[r'/home/roman/language-binding/sources/pyplusplus_dev/unittests/temp/abstract_classes.cpp'],
    LIBS=[r"boost_python"],
    LIBPATH=[r"", r"/home/roman/include/libs"],
    CPPPATH=[
        r"/home/roman/boost_svn",
        r"/usr/include/python2.6",
        r"/home/roman/language-binding/sources/pyplusplus_dev/unittests/temp",
        r"/home/roman/language-binding/sources/pyplusplus_dev/unittests/data",
        r"/home/roman/boost_svn"
    ],
    CCFLAGS=[  ],
    SHLIBPREFIX='',
    SHLIBSUFFIX='.so'
)

Поскольку ваш генератор кода написан на Python, вы можете продолжить там, где останавливается Py ++, и сгенерировать ваш любимый файл "make". Вы можете пойти даже отец. Тесты Py ++ генерируют код, компилируют, загружают новый модуль и тестируют функциональность. Все это делается в одном отдельном процессе.

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

Я написал небольшой make-файл со следующим:

GNUmakefile:

PYTHON_INC=$(shell python-config --includes)
PYTHON_LIBS=$(shell python-config --libs)
BOOST_LIBS=-lboost_python

all:
    g++ -W -Wall $(PYTHON_INC) $(PYTHON_LIBS) $(BOOST_LIBS) -fPIC -shared generated.cpp -o hw.so

, а затем загрузил созданный .so в ipython, чтобы поиграть с ним:

In [1]: import hw
In [2]: a = hw.animal('zebra')
In [3]: a.name()
Out[3]: 'zebra'
...