Как создать приложение, которое встраивает и запускает код Python без локальной установки Python?

Здравствуйте коллеги-программисты.

Я хочу распространять программу на C, которая поддерживает сценарии, встраивая интерпретатор Python.
Программа на C использует Py_Initialize, PyImport_Import и т. д. для выполнения встраивания Python.

Я ищу решение, в котором я распространяю только следующие компоненты:

  • исполняемый файл моей программы и его библиотеки
  • библиотека Python (dll/so)
  • ZIP-файл, содержащий все необходимые модули и библиотеки Python.

Как я могу это сделать? Есть ли пошаговый рецепт для этого?

Решение должно подходить как для Windows, так и для Linux.

Заранее спасибо.


person Robert    schedule 22.03.2010    source источник
comment
Я удалил свой ответ, так как он неприменим. Возможно, вы захотите отредактировать вопрос, чтобы было ясно, что вы встраиваете Python в приложение C.   -  person FogleBird    schedule 22.03.2010
comment
Возможно, связано: stackoverflow.com/questions/1387906/   -  person Daniel Pryden    schedule 22.03.2010


Ответы (6)


Вы смотрели официальную документацию Python: Встраивание Python в другое приложение?

Также есть очень хороший PDF-файл от IBM: Встроить Python скрипты в приложении C.

Вы должны иметь возможность делать то, что хотите, используя эти два ресурса.

person Laurent Parenteau    schedule 22.03.2010
comment
Я сделал это, следуя руководству по встраиванию, и это сработало. - person dash-tom-bang; 22.03.2010

Я просто протестировал свой исполняемый файл на компьютере, на котором не установлен Python, и он сработал.

Когда вы связываете Python со своим исполняемым файлом (независимо от того, динамически или статически), ваш исполняемый файл уже получает базовую функциональность языка Python (операторы, методы, базовые структуры, такие как строка, список, кортеж, словарь и т. д.) БЕЗ каких-либо других зависимостей.

Затем я позволил Python setup.py скомпилировать исходный дистрибутив Python через python setup.py sdist --format=zip, который дал мне ZIP-файл, который я назвал pylib-2.6.4.zip.

Мои дальнейшие действия были такими:

char pycmd[1000]; // temporary buffer for forged Python script lines
...
Py_NoSiteFlag=1;
Py_SetProgramName(argv[0]);
Py_SetPythonHome(directoryWhereMyOwnPythonScriptsReside);
Py_InitializeEx(0);

// forge Python command to set the lookup path
// add the zipped Python distribution library to the search path as well
snprintf(
    pycmd,
    sizeof(pycmd),
    "import sys; sys.path = ['%s/pylib-2.6.4.zip','%s']",
    applicationDirectory,
    directoryWhereMyOwnPythonScriptsReside
);

// ... and execute
PyRun_SimpleString(pycmd);

// now all succeeding Python import calls should be able to
// find the other modules, especially those in the zipped library

...
person Robert    schedule 29.03.2010

Вы ознакомились с Portable Python? Не нужно ничего устанавливать. Просто скопируйте включенные файлы, чтобы использовать интерпретатор.

Изменить: это решение только для Windows.

person Pierre-Jean Coudert    schedule 22.03.2010
comment
Портативный Python также был находкой, когда я проводил свое исследование. Но это не то, что я ищу. Никакой другой зависимости быть не должно. - person Robert; 22.03.2010

Вы смотрели Встраивание Python в другое приложение в документации по Python?

Получив это, вы можете использовать обработчик импорта (см. PEP 302). ), чтобы встроенный код Python загружал модули из любого места по вашему выбору. Однако, если у вас есть все в одном zip-файле, вам, вероятно, просто нужно сделать его единственной записью в sys.path.

person Daniel Pryden    schedule 22.03.2010
comment
Эх, надо было обновить комментарии перед публикацией...! - person Laurent Parenteau; 22.03.2010

Я думаю, вот ответ, который вам нужен встроенный для работы с заархивированной библиотекой

В основном вам нужно:

Py_NoSiteFlag=1;
Py_SetProgramName(argv[0]);
Py_SetPythonHome(".");
Py_InitializeEx(0);
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path = ['.','python27.zip','python27.zip/DLLs','python27.zip/Lib','python27.zip/site-packages']");

в вашем коде c/c++ для загрузки стандартной библиотеки python.

И в вашем python27.zip весь исходный код .py находится в python27.zip/Lib, как описано в переменной sys.path.

Надеюсь это поможет.

person liangfu    schedule 19.03.2014

Есть программа py2exe. Я не знаю, доступно ли это только для Windows. Кроме того, последняя версия, которую я использовал, не упаковывает все в один файл .exe. Он создает кучу вещей, которые нужно распространять - zip-файл и т. Д.

person Jive Dadson    schedule 29.03.2010
comment
Название вводит в заблуждение — встроен Python. Я не хочу, чтобы код Python был встроен в исполняемый файл — исполняемый файл должен стать доступным для сценариев, будучи связанным с Python. Поэтому py2exe не является решением. - person Robert; 29.03.2010