Как вставить Python3 со стандартной библиотекой

Я пытаюсь внедрить Python в (в конечном счете, многоплатформенном) приложении C ++.

Очень важно, чтобы мое приложение содержало собственную реализацию Python (так же, как и блендер), так что он полностью автономный. (Иначе это становится минным полем конфигурации).

У меня есть два варианта:

  1. Попытайтесь внедрить Python3 без стандартной библиотеки (которую я здесь задал)

  2. Попытайтесь внедрить Python3 со стандартной библиотекой.

Что требуется для (2)?

С помощью этой информации я смог бы сбалансировать достоинства каждого подхода в отношении усилий, необходимых для его настройки.

Мой встроенный Python будет для моего собственного использования (а не для любых пользовательских скриптов) – в основном, управляет логикой потока / игры. Мне нужно очень мало от стандартной библиотеки – возможно, я смогу отменить это до 0 путем туннелирования обратно на C ++, когда это необходимо, например, если мне нужно случайное число, я могу создать подпрограмму C ++ и получить доступ к этому из Python. У меня все покрыто.

Тем не менее, начинает казаться, что даже минимальная установка должна содержать некоторые компоненты stdlib, которые задают вопрос: «Если я должен включить некоторые, возможно, лучше включить все!»

    Я полагаю, что вы уже дважды проверяете, как встраивать Python в другое приложение ( здесь вы увидите что-то, что покрывает вложение python2, но будет верно и для python3 также, на мой взгляд)

    Существуют различные типы встраивания:

    • Внедрение очень высокого уровня
    • Вне внедрения очень высокого уровня
    • Чистое встраивание
    • Вложение Python в C ++

    Поскольку ваш вопрос относится к «Embedding Python in C ++», вы можете прочитать следующее:

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

    Как одна рука вы сказали « (в конечном счете, мультиплатформенное) приложение на C ++ », а с другой стороны у вас есть « точно, как это делается, будет зависеть от деталей используемой системы C ++ », так что вы можете объяснить более подробную информацию о используемой системе C ++ ?

    Вы также можете найти здесь несколько советов относительно использования модуля pybind11 или другой старой страницы, в которой говорится о том, как внедрять Python и импортировать модули в C / C ++ (python2.6, но я надеюсь, что вы можете найти вдохновение)

    Заключить:

    Вам, очевидно, понадобятся пакеты разработки для Python, чтобы иметь каталог Python include

    Вы ищете Boost.Python !

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

    Он также имеет механизм для встраивания интерпретатора python в код C ++, и можно обратиться к этой ссылке (URL-адрес не относится к выпуску), чтобы изучить возможности.

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

    Поскольку у этого нет действительно ответа, я предложу это для потомков. У меня также нет доступа к Mac, поэтому для вас это может быть немного отличающимся от Linux. Кроме того, для этого необходимо установить необходимые зависимости, чтобы это можно было выполнять, но это обычно достаточно легко понять.

    Создать рабочий каталог

    mkdir ~/embeddedpython cd ~/embeddedpython 

    Загрузите источник Python

     wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz 

    Создайте каталог установки для Python

     mkdir ./installation 

    Извлечь загруженные исходные файлы

     tar xvf Python-3.6.1.tgz 

    Введите вновь созданный исходный каталог

     cd Python-3.6.1 

    Настройка Python для установки в нашем каталоге установки

     ./configure --prefix="/home/<username>/embeddedpython/installation" 

    Создание и установка Python

     make && make install 

    Вернитесь в рабочий каталог

     cd .. 

    Создайте новый каталог PYTHONHOME, в котором будет находиться библиотека

     mkdir home && mkdir home/lib 

    Скопируйте библиотеку Python в наш новый домашний каталог

     cp -r ./installation/lib/python3.6 ./home/lib/ 

    Создайте новый исходный файл c ++ (embeddedpython.cpp) со следующим кодом, взятым из документации python , за исключением вызова функции setenv .

     #include <Python.h> #include <cstdlib> int main(int argc, char *argv[]) { setenv("PYTHONHOME", "./home", 1); wchar_t *program = Py_DecodeLocale(argv[0], NULL); if (program == NULL) { fprintf(stderr, "Fatal error: cannot decode argv[0]\n"); exit(1); } Py_SetProgramName(program); /* optional but recommended */ Py_Initialize(); PyRun_SimpleString("from time import time,ctime\n" "print('Today is', ctime(time()))\n"); if (Py_FinalizeEx() < 0) { exit(120); } PyMem_RawFree(program); return 0; } 

    Скомпилировать и запустить

     g++ embeddedpython.cpp -I ./installation/include/python3.6m/ ./installation/lib/libpython3.6m.a -lpthread -ldl -lutil ./a.out > Today is Fri Apr 14 16:06:54 2017 

    Отсюда он является стандартным встроенным питоном, как обычно. С помощью этого метода в вашем развертывании должен быть включен каталог «home», и переменная среды PYTHONHOME должна быть установлена ​​так, чтобы указывать на нее до выполнения любого кода, связанного с python.