Почему 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'

Даже не знаю что делать потому что если пойти в папку :
То видим что всё как бы есть 🙂
Помимо этого всего есть обычный питон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. Эта переменная будет использоваться для поиска нужных библиотек:

Определим файл app.c со следующей программой на языке C:
#include int main()
Прежде всего, чтобы встроить Python в программу, подключаем заголовочный файл Python.h . Этот файл устанавливается вместе с другими файлами интерпретатора Python по умолчанию. Мы его можем найти в папке интерпретатора Python в каталоге include

В программе сначала вызываем функцию 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
Если инструкций на 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 собранная статически библиотека пытается обратиться к интерпретатору(он установлен)? если да то как можно собрать Python так что бы он мог работать в OS где не установлен Python. Сообщение отредактировано: DEADHUNT — 08.01.11, 22:30 Senior Member Рейтинг (т): 268 Может я чего не понимаю, но вижу, две что интерпретатор не нашел две библиотеки. Одна из них специфична для платформы. Сообщ. #4 , 09.01.11, 12:34 есть программа на C++ в неё встроен интерпретатор питона(embedded python), что никто не использовал? Добавлено 09.01.11, 12:48 Сообщение отредактировано: DEADHUNT — 09.01.11, 12:48 теперь сделал заморозку всех модулей, слинковал их с программой. Could not find platform independent libraries
Consider setting $PYTHONHOME to
ImportError: No module named site
Сообщ. #2 , 09.01.11, 02:00
Рейтинг (т): 23
Не уверен, но как на счет совместимости версий интепретатора в твоей и испытуемой ОС?
Цитата DEADHUNT @ 08.01.11, 22:30
если да то как можно собрать Python так что бы он мог работать в OS где не установлен Python.
может хочется иметь нечто подобное http://www.py2exe.org/ но только для линукса?
Сообщ. #3 , 09.01.11, 07:36
Думаю, поэтому и не работает.
Senior Member
Цитата NetVir @ 09.01.11, 02:00
может хочется иметь нечто подобное http://www.py2exe.org/ но только для линукса?
вывод этих сообщений происходит при вызове Py_Initialize(), вроде надо настроить переменную PYTHONPATH настроить чтобы она указывала на модули, но ведь можно как-то собрать питон чтобы он включал в себя все необходимые модули(Python Freeze).
кажется нашёл решение(http://trac2.assembla.com/pkaudio/browser/pkscriptapp/src/engine/scripting/ScriptingApplication.cpp?rev=26), надо в начале заморозить все требуемые модули а потом подгрузить их перед вызовом Py_Initialize()
Сообщ. #5 , 09.01.11, 22:00
Senior Member
PyImport_FrozenModules = frozen_modules;
Py_Initialize();
получаю следующее:
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)