Можем ли мы создать exe-файл, использующий вызовы Python, без установки Python на целевой машине?

#python #c #python-3.x #python-c-api

Вопрос:

У меня есть этот код C, который я взял из https://docs.python.org/3/extending/embedding.html:

 #define PY_SSIZE_T_CLEAN
#include <Python.h>

int
main(int argc, char *argv[])
{
    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("import numpy as np n"
"student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])n" 
"print(student)n");
    if (Py_FinalizeEx() < 0) {
        exit(120);
    }
    PyMem_RawFree(program);
    return 0;
}
 

Он компилируется и довольно хорошо работает на машине, на которой установлены python3 и python3-numpy.
Вывод:

 [('name', 'S20'), ('age', 'i1'), ('marks', '<f4')]
 

Однако, если на целевой машине не установлен numpy, вывод будет:

 Traceback (most recent call last):
  File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'numpy'
 

Мой вопрос: можно ли запустить код python из исполняемого файла приложения на целевой машине, на которой не установлены Python3 и numpy? Если да, то как мне это сделать?

Я в основном думаю о Win10 как о целевой машине, но, думаю, мой вопрос в равной степени применим и к другим операционным системам.

Спасибо!

ПРАВКА: Если быть более точным, я не спрашиваю, можно ли скомпилировать этот код без установки Python. Я знаю, что для компиляции в нем должен быть какой-то python-разработчик.

Но я хочу знать, есть ли способ создать exe-файл, который использует некоторые вызовы Python без установки Python на целевой машине?

Комментарии:

1. Откуда вы ожидаете, что ваша программа получит всю свою функциональность Python без Python?

2. Этот код явно вызывает Python и библиотеку Python numpy, так что нет, это невозможно сделать. Но я полагаю, что их можно будет установить и на коробку Win10.

Ответ №1:

Используйте PyInstaller. Он превратит ваш код Python, интерпретатор Python и необходимые вам пакеты в отдельный файл .exe.

В частности, numpy находится в списке поддерживаемых пакетов.

Я бы избавился от программы на C, поместил ваш основной код Python в файл .py и позволил PyInstaller выполнить работу за вас.

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

Полная информация приведена в документах PyInstaller.

Комментарии:

1. Спасибо! Однако я не могу избавиться от программы на языке Си, так как основная работа выполняется частью на языке Си. Python создаст только несколько анимационных файлов в новых запущенных процессах.

2. Ах да, это все меняет. Вот еще одна идея: нужно ли вашему коду C и Python обмениваться данными в памяти? Или было бы полезно запустить код Python в отдельном процессе, запущенном из кода C, и обмениваться данными с помощью файлов или stdin/stdout, именованных каналов или…? Если работает отдельный процесс Python, вы можете использовать PyInstaller для создания этого исполняемого файла.

3. Еще одна идея, пока мы проводим мозговой штурм: вы могли бы инвертировать это и сделать Python своей основной программой, скомпилировать код C в DLL и использовать либо собственный API Python/C, либо что-то вроде Clif или Swig, чтобы упростить вызов, если вы используете C . В любом случае вы все равно можете использовать PyInstaller для объединения ваших двоичных файлов.