Использование кода, сгенерированного Py ++ как расширение Python

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

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

5
задан Community 23 May 2017 в 12:09
поделиться

2 ответа

Люди свободно ссылаются на HTML5 в контексте этого обсуждения, это комбинация HTML в качестве языка разметки, CSS, который указывает, как он визуализируется, и javascript-код, который динамически манипулирует HTML и CSS.

Кроме того, HTML5 имеет не только стандартные текстовые элементы, но и < canvas > , на которых можно рисовать 2d-графику, и < video > элементы, которые встраивают видео (как предполагает название).

Таким образом, в полноценной реализации HTML5 можно реализовать динамические веб-сайты без использования Flash. Примером может служить HTML5 версия Youtube, недавно представленная в качестве бета-версии для пользователей Safari/Chrome, см. здесь . Другой - эмулятор NES в javascript + HTML. (Ну, последнее не очень касается HTML5... используется < холст > .)

-121--1836496-

http://spoon.net/browsers/ Ложка позволяет создавать размещенные в Интернете версии существующих приложений Windows, которые мгновенно запускаются с веб- сайтом без установки. У ложки есть галерея браузеров, которые вы можете запустить, включая:

Microsoft Internet Explorer 8, Internet Explorer 7 и Internet Explorer 6 Mozilla Firefox 3.5, Firefox 3 и Firefox 2 Apple Safari 4 и Safari 3 Google Chrome, Опера 10, Опера 9

-121--1042976-

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

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

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

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

Последнее примечание, имя, данное в generated.cpp в этом макросе:

BOOST_PYTHON_MODULE( -name- )

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

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

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

Изменить: Если вы хотите, чтобы ваше расширение было легко установлено и скомпилировано на компьютере, проверьте setuptools питона.Всего с несколькими простыми строками вы можете иметь python компилировать и установить свой пакет для вас. Одним из недостатков является его несовместимость с IDE для тех из нас, кто любит развивать в визуальной студии.

6
ответ дан 13 December 2019 в 19:27
поделиться

Следующий ответ мне дал Роман Яковенко из списка рассылки Python C++-sign; я размещаю его здесь, с небольшими правками, в интересах сообщества 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++ тесты генерируют код, компилируют, загружают новый модуль и проверяют функциональность. Всё это делается в рамках одного, самостоятельного процесса.

4
ответ дан 13 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: