Перейти к содержимому

Embeddable python как установить

  • автор:

Почему embedded питон не видит библиотеку pip?

Всем доброго времени суток !
Я решил сделать мини дистрибутив для программы на питоне 🙂
Скачал embedded python и установил pip всё как бы есть и как бы нету 🙂
При попытке что либо установить пишет :

Traceback (most recent call last): File "runpy.py", line 193, in _run_module_as_main File "runpy.py", line 85, in _run_code File "C:\Users\terno\Desktop\1\Scripts\pip.exe\__main__.py", line 5, in ModuleNotFoundError: No module named 'pip'

C3xZDoh4RAa81lS-xnIuTQ.png

Даже не знаю что делать потому что если пойти в папку :

То видим что всё как бы есть 🙂
Помимо этого всего есть обычный питон3.

  • Вопрос задан более трёх лет назад
  • 1398 просмотров

4 комментария

Простой 4 комментария

Установка pip из архива Windows

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

Traceback (most recent call last): File "./packages/setuptools-51.1/setuptools-51.1.0/setup.py", line 7, in import setuptools ModuleNotFoundError: No module named 'setuptools' 

Скрипт, который я запускаю:

#! ./python-3.6.5-embed-amd64/python.exe from subprocess import call call(["python", "./packages/setuptools-51.1/setuptools-51.1.0/setup.py"]) 

Но чтобы поставить тот же setuptools нужен setuptools . Как еще можно установить pip или setuptools из локальной директории?

Взаимодействие с кодом Python

Язык программирования Python обладает большими возможностями, имеет богатый функционал и библиотеки, написание которых на языке Си может занять продолжительное время, особенно это касается сферы машинного обучения. И было бы неплохо просто взять готовую функциональность на Python и инкорпорировать в программу на C. И Python позволяет это сделать, предоставляя такую функциональность, как Embedded Python (встраиваемый Python). То есть мы можем встроить в программу на C интерпретатор Python и выполнять в программе на C код на языке Python. Рассмотрим, как это сделать.

Настройка и компиляция на Windows

Для работы на ОС Windows прежде всего нам нужно узнать путь к установленному интерпретатору Python. Например, в моем случае это путь C:\Users\eugen\AppData\Local\Programs\Python\Python311 . Для упрощения работу установим в переменных среды переменную PYTHONHOME . Она должна указывать на путь к каталогу, где установлен Python. Эта переменная будет использоваться для поиска нужных библиотек:

Настройка PYTHONHOME для Embedded Python

Определим файл app.c со следующей программой на языке C:

#include int main()

Прежде всего, чтобы встроить Python в программу, подключаем заголовочный файл Python.h . Этот файл устанавливается вместе с другими файлами интерпретатора Python по умолчанию. Мы его можем найти в папке интерпретатора Python в каталоге include

Python.h в программе на языке C

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

Чтобы выполнить некоторый код Python, применяется функция PyRun_SimpleString() , в которую передается код Python

PyRun_SimpleString("print('Hello METANIT.COM')");

Здесь код Python представляет вывод строки на консоль с помощью функции print()

После выполнения кода Python вызываем функцию Py_Finalize() , которая освобождает память, выделенную для интерпретатора Python.

Для компиляции в Windows используем компилятор gcc . Выполним команду

gcc -Wall -I %PYTHONHOME%\include -L %PYTHONHOME%\libs -o app.exe app.c -lpython311 & app

При компиляции с помощью опции -I нам надо передать пусть к заголовочным файлам, а это папка %PYTHONHOME%\include . Чтобы не писать полный путь, заменяем его часть содержимым ранее установленной переменной PYTHONHOME

Кроме того, с помощью опции -L надо установить путь к библиотеке python. А это путь %PYTHONHOME%\libs

Поскольку в моем случае используется версия python 3.11, то указывается параметр -lpython311

В итоге при выполнении программы будет выполняться код Python, который выведет на консоль строку:

c:\C>gcc -Wall -I %PYTHONHOME%\include -L %PYTHONHOME%\libs -o app app.c -lpython311 & app Hello METANIT.COM c:\C>

При этом в программе могут быть и другие инструкции на языке C:

#include #include int main()

Компиляция на Linux

Компиляция на Linux несколько отличается. Для компиляции на Ubuntu применяется следующая команда:

gcc -Wall $(python3-config --cflags) -o app app.c $(python3-config --embed --ldflags)

Использование библиотек Python

Подобным образом можно использовать более сложный код Python. В том числе с использованием сторонних библиотек Python. Например, нарисуем произвольный график с помощью библиотек numpy и matplotlib . Соответственно нам надо вначале установить данные библиотеки с помощью пакетного менеджера pip:

pip install numpy pip install matplotlib

Для создания графика определим на С следующую программу:

#include int main()

В данном случае сначала подключаем функционал библиотек numpy и matplotlib .

import numpy as np import matplotlib.pyplot as plt

Далее генерируем значения, которые отображаются по оси X:

x = np.array(range(0, 8))

Для генерации применяется функция np.array() библиотеки Numpy, которая создает набор чисел от 0 до 7.

Далее по значениям X получаем значения Y по определенной формуле. Здесь мы рисуем график функции y = 2x + 1 . И для вычисления значений Y применяем встроенную функцию eval() , которая есть в языке Python и которая вычисляет произвольное выражение.

y = eval('2 * x + 1')

Затем устанавливаем заголовок графика

plt.title('y = 2x + 1')

Устанавливаем текстовые метки для осей X и Y:

plt.xlabel('x') plt.ylabel('y')

И в конце отрисовываем график и отображаем его на экране:

plt.plot(x,y) plt.show()

Применение модулей Python в программе на языке C

Выполнение файла с кодом Python

Если инструкций на Python много, то их проще определить в отдельный файл. Затем в программе на языке С этот файл можно выполнить с помощью функции PyRun_SimpleFile() , которая имеет следующее определение:

int PyRun_SimpleFile(FILE *fp, const char *filename)

В качестве первого параметра передается дескриптор файла, а в качестве второго — имя файла.

Например, определим в одной папке с программой файл main.py со следующим кодом на языке Python:

print("Hello Python in C")

Здесь код просто выводит строку на консоль.

В главном файле программы на C (допустим, он называется app.c ) выполним этот скрипт Python:

#include int main() < char filename[] = "main.py"; Py_Initialize(); FILE* fp = fopen(filename, "rb"); // открываем файл и if(fp) PyRun_SimpleFile(fp, filename); // выполняем программу python Py_Finalize(); return 0; >

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

Embeddable python как установить

затем слинковал со своей программой статически.
в моей OS(linux ubuntu 10.10) всё нормально работает, затем запускаю в Mandriva Spring, на stdout получаю следующее:

Could not find platform independent libraries Could not find platform dependent libraries
Consider setting $PYTHONHOME to [:]
ImportError: No module named site

собранная статически библиотека пытается обратиться к интерпретатору(он установлен)? если да то как можно собрать Python так что бы он мог работать в OS где не установлен Python.

Сообщение отредактировано: DEADHUNT — 08.01.11, 22:30
Сообщ. #2 , 09.01.11, 02:00

Senior Member
Рейтинг (т): 23
Не уверен, но как на счет совместимости версий интепретатора в твоей и испытуемой ОС?
Цитата DEADHUNT @ 08.01.11, 22:30
если да то как можно собрать Python так что бы он мог работать в OS где не установлен Python.
может хочется иметь нечто подобное http://www.py2exe.org/ но только для линукса?
Сообщ. #3 , 09.01.11, 07:36

Рейтинг (т): 268

Может я чего не понимаю, но вижу, две что интерпретатор не нашел две библиотеки. Одна из них специфична для платформы.
Думаю, поэтому и не работает.

Сообщ. #4 , 09.01.11, 12:34
Senior Member
Цитата NetVir @ 09.01.11, 02:00
может хочется иметь нечто подобное http://www.py2exe.org/ но только для линукса?

есть программа на C++ в неё встроен интерпретатор питона(embedded python), что никто не использовал?
вывод этих сообщений происходит при вызове Py_Initialize(), вроде надо настроить переменную PYTHONPATH настроить чтобы она указывала на модули, но ведь можно как-то собрать питон чтобы он включал в себя все необходимые модули(Python Freeze).

Добавлено 09.01.11, 12:48
кажется нашёл решение(http://trac2.assembla.com/pkaudio/browser/pkscriptapp/src/engine/scripting/ScriptingApplication.cpp?rev=26), надо в начале заморозить все требуемые модули а потом подгрузить их перед вызовом Py_Initialize()

Сообщение отредактировано: DEADHUNT — 09.01.11, 12:48
Сообщ. #5 , 09.01.11, 22:00
Senior Member

теперь сделал заморозку всех модулей, слинковал их с программой.
PyImport_FrozenModules = frozen_modules;
Py_Initialize();
получаю следующее:

Could not find platform independent libraries Could not find platform dependent libraries
Consider setting $PYTHONHOME to [:]
Traceback (most recent call last):
File «site.py», line 553, in
File «site.py», line 535, in main
File «site.py», line 268, in addusersitepackages
File «site.py», line 243, in getusersitepackages
File «site.py», line 233, in getuserbase
File «sysconfig.py», line 535, in get_config_var
File «sysconfig.py», line 434, in get_config_vars
File «sysconfig.py», line 287, in _init_posix
IOError: invalid Python installation: unable to open /usr/local/lib/python2.7/config/Makefile (No such file or directory)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *