powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Модуль plPython3u (переход на новую версию из tgz)
10 сообщений из 10, страница 1 из 1
Модуль plPython3u (переход на новую версию из tgz)
    #40124098
ronvaleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем.
Пытался найти информацию в инете, но не удалось.
Дано:
Сервер Debian 8.6
БД PostgreSql 9.6
Python3 Python 3.4.*

Проблема в следующем. Необходимо, чтобы версия питона в расширении была выше 3.6, т.к. необходимо работать с определенными модулями питона.

Репозиторий дебиана 8.6 мертв.
При установки питона 3.10.1 из tgz он появляется в системе, работает, но в расширении plpython3u как ни крути остается старая версия. Смена линков и переустановка модуля postgresql-plpython3-9.6 результатов не дает. Как я понимаю, постгрес работает с системным питоном, но как это исправить нигде не нашел.
Помогите советом пожалуйста, пните в нужном направлении.
...
Рейтинг: 0 / 0
Модуль plPython3u (переход на новую версию из tgz)
    #40124113
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ronvaleron
Репозиторий дебиана 8.6 мертв.

https://www.debian.org/distrib/archive + https://apt-archive.postgresql.org/ если база оттуда

как линкуется plpython с собственно бинарниками питона - не разбирал. Возможно extenson нужно будет пересобрать руками.
...
Рейтинг: 0 / 0
Модуль plPython3u (переход на новую версию из tgz)
    #40124141
ronvaleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkij,

Насчет репозитория, там вроде нет свежего питона.
А вот по линкам это уже вопрос. Этого будет достаточно, что бы постгрес увидел новую версию из tgz?
Куда копать всетаки?
Пытался посмотреть пакет postgresql-plpython3-9.6, ничего внутри не нашел. После установки тоже ничего путного не увидел, только /usr/share/postgresql/13/extension/plpython3u--1.0.sql.
...
Рейтинг: 0 / 0
Модуль plPython3u (переход на новую версию из tgz)
    #40124303
grgdvo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ronvaleron,

для начала посмотрите, какая библиотека нужна
у меня не дебиан и не 9ый постгрес, но показывает вот так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
~ $ ldd /usr/lib64/postgresql-13/lib64/plpython3.so 
	linux-vdso.so.1 (0x00007ffe4e9a6000)
	libpython3.9.so.1.0 => /usr/lib64/libpython3.9.so.1.0 (0x00007eff8d0ad000)  <==============
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007eff8d076000)
	libc.so.6 => /lib64/libc.so.6 (0x00007eff8cebd000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007eff8ceb7000)
	libutil.so.1 => /lib64/libutil.so.1 (0x00007eff8ceb2000)
	libm.so.6 => /lib64/libm.so.6 (0x00007eff8cd73000)
	/lib64/ld-linux-x86-64.so.2 (0x00007eff8d448000)

В моей инсталляции требуется libpython3.9.so.1.0. Если пробовать заменять, то тогда только этот файл.

Более корректный способ действительно пересобрать из исходников, указав в PATH и PYTHON_PATH при сборке местоположение Вашего нового питона.
...
Рейтинг: 0 / 0
Модуль plPython3u (переход на новую версию из tgz)
    #40124539
ronvaleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
grgdvo,

Спасибо за наводку. Проверил на экспериментальном серваке, там системный питон 3.9.2, а сторонний установлен 3.10.1.
Да, в либак прописан тот, что из пакета с репозитория.
Начал искать информацию, как подменить либы, пока нашел только как скомпилировать либы из исходников *.o. Но не понятно есть ли нуждные исходники в пакете питона из файла tgz с офф сайта и что делать дальше, после сборки библиотек... Проще конечно плюнуть и накатить новый сервак. Но если честно, хочется разобраться в этой механике.

root@debian:/lib/x86_64-linux-gnu# ldd /usr/lib/postgresql/13/lib/plpython3.so

linux-vdso.so.1 (0x00007ffc67927000)

libpython3.9.so.1.0 => /lib/x86_64-linux-gnu/libpython3.9.so.1.0 (0x00007fcf7ef98000)

libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fcf7ef76000)

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcf7edb1000)

libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007fcf7ed82000)

libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fcf7ed65000)

libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fcf7ed5f000)

libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fcf7ed58000)

libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fcf7ec14000)

/lib64/ld-linux-x86-64.so.2 (0x00007fcf7f55c000)

...
Рейтинг: 0 / 0
Модуль plPython3u (переход на новую версию из tgz)
    #40124674
grgdvo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ronvaleron,

Думаю, что шаги должны быть примерно следующими (для всего процесса понадобится предварительно установить компилятор, binutils, gnu make, bison, flex и т.п. что нужно в требованиях для сборки Python и PG):

Часть 1. Установка Python
1) качаем архив исходников 3.10.1 (tar.xz файл)
2) Распаковываем исходники
3) Конфигурируем: ./configure --enable-shared --enable-optimizations --prefix=/my-new-python-root-here
4) Собируем: make
5) Ставим в указанную в prefix директорию: make install

На этом установка python-3.10.1 окончена. Стоит проверить работоспособность, проверить работу pip и прочего, чтобы в нужное место ставились нужные пакеты.

Часть 2. Пересборка PL/Python в PG
1) запускаем pg_config вашей установленной версии PG
из вывода находим VERSION и CONFIGURE
2) качаем исходники нужной версии (лучше через git, далее git checkout RELX_Y_Z, можно и архив выкачать и распаковать в какую-либо директорию)
3) далее в распакованной директории запускаем то, что у вас вывел pg_config в CONFIGURE
ОБРАТИТЬ внимание на всякие пути к Питону. Их нужно подкорректировать на вашу директорию с python-3.10.1
./configure ..... здесь из pg_config все параметры, с подкорректированным питоном
В выводе configure убедиться, что был найден нужный python именно вашей версии

Код: plaintext
1.
2.
3.
checking for PYTHON... /my-new-python-root-here/Python-3.10.1/bin/python3
configure: using python 3.10.1 (main, Jan  4 2022, 15:11:39) [GCC 11.2.0]
checking for Python distutils module... yes

4) Далее собираем PG вашей версии
make
5) Проверяем директорию сборки pl\python. Должны получить нечто такое
Код: plaintext
1.
2.
3.
4.
$ ls -la src/pl/plpython/plpython3*
-rwxr-xr-x 1 user user 157768 янв  4 15:34 src/pl/plpython/plpython3.so
-rw-r--r-- 1 user user    556 июн 29  2021 src/pl/plpython/plpython3u--1.0.sql
-rw-r--r-- 1 user user    196 янв 22  2020 src/pl/plpython/plpython3u.control
6) Проверяем, что вновь собранное расширение PL/Python3 слинковано с нужным Питоном
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
# LD_LIBRARY_PATH=/my-new-python-root-here/Python-3.10.1/lib ldd plpython3.so
	linux-vdso.so.1 (0x00007ffd5c5f8000)
	libpython3.10.so.1.0 => /my-new-python-root-here/Python-3.10.1/lib/libpython3.10.so.1.0 (0x00007f9115993000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f911595c000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f91157a3000)
	libcrypt.so.2 => /lib64/libcrypt.so.2 (0x00007f9115768000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f9115762000)
	libutil.so.1 => /lib64/libutil.so.1 (0x00007f911575d000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f911561c000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f9115d4e000)
Для нахождения библиотеки от "ручного" Питона потребуется сконфигурировать лоадер, см. ld.so.conf.
А также не забывать использовать переменную LD_LIBRARY_PATH. Скорее всего ее потребуется прописать в запуск сервиса PG.
В debian это вероятно можно сделать через изменение service-файла.

Часть 3. Подмена plpython3.so
1) Теперь можно пойти и попробовать подменить собранный plpython3.so. Старый файл сохраняем где-то, новый копируем на его место.
/usr/lib64/postgresql-13/lib64 # ls -la plpython3.so*
-rwxr-xr-x 1 root root 157768 янв 4 15:41 plpython3.so
-rwxr-xr-x 1 root root 138312 ноя 13 16:41 plpython3.so.bak

2) Здесь надо перезапустить Ваш установленный в системе PG.
3) Далее коннектимся к любой базе и проверяем, что все подцепилось.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
$ psql -U postgres test
psql (13.5)
Введите "help", чтобы получить справку.

test=# create extension plpython3u;
CREATE EXTENSION
test=#
test=#
test=# create function python_version() returns text as $$
test$# import sys
test$# return sys.version_info
test$# $$ language plpython3u;
CREATE FUNCTION
test=# select python_version();
                                python_version                                
------------------------------------------------------------------------------
 sys.version_info(major=3, minor=10, micro=1, releaselevel='final', serial=0)
(1 строка)

Вроде все на месте после подмены.

Далее уже более глубоко проверять: как пакеты импортируются, что там с типами данных при вызове функций, ну и так далее по манулу использования PL/Python.

С Новым Годом!
...
Рейтинг: 0 / 0
Модуль plPython3u (переход на новую версию из tgz)
    #40124702
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ronvaleron
grgdvo,

Спасибо за наводку. Проверил на экспериментальном серваке, там системный питон 3.9.2, а сторонний установлен 3.10.1.
Да, в либак прописан тот, что из пакета с репозитория.
Начал искать информацию, как подменить либы, пока нашел только как скомпилировать либы из исходников *.o. Но не понятно есть ли нуждные исходники в пакете питона из файла tgz с офф сайта и что делать дальше, после сборки библиотек... Проще конечно плюнуть и накатить новый сервак. Но если честно, хочется разобраться в этой механике.

root@debian:/lib/x86_64-linux-gnu# ldd /usr/lib/postgresql/13/lib/plpython3.so

linux-vdso.so.1 (0x00007ffc67927000)

libpython3.9.so.1.0 => /lib/x86_64-linux-gnu/libpython3.9.so.1.0 (0x00007fcf7ef98000)

libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fcf7ef76000)

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcf7edb1000)

libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007fcf7ed82000)

libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fcf7ed65000)

libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fcf7ed5f000)

libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fcf7ed58000)

libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fcf7ec14000)

/lib64/ld-linux-x86-64.so.2 (0x00007fcf7f55c000)



Вы не можете использовать постгресовые либы от одного питона а питон другой версии... так не бывает (точнее так не работает).
--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Модуль plPython3u (переход на новую версию из tgz)
    #40125439
ronvaleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
grgdvo,

Спасибо огромное, всё получилось. Инструкция очень помогла. Интересно, а если я соберу библиотеку plpython3.so на другом компе, но все пути будут соблюдены к стороннему питону, будет ли она работать ну и версии соответственно тоже будут соответствовать?
в смысле библиотеки имеют просто ссылки на конкретные файлы с полным путем или там есть что-то еще?
...
Рейтинг: 0 / 0
Модуль plPython3u (переход на новую версию из tgz)
    #40125629
grgdvo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ronvaleron,

В различных заголовках исполняемых файлов (не слинкованных статически) и разделяемых библиотек есть соответствующие таблицы и атрибуты, где записано какие библиотеки нужны по каким именам (SONAME) и каким путям (RPATH и RUNPATH).
Вот здесь об этом расписано (параметр -Wl,-rpath), как примерно это работает.
Все эти таблицы может заполнить линкер, если ему дать соответствующие параметры при сборке.

Использовать или не использовать rpath - выбор мейнтейнера этой библиотека и ее зависимых библиотек.
Например для каких-нибудь "своих" плагинов выгодно вставить библиотеку по полному пути, чтобы сразу было понятно откуда брать этот плагин и находить и загружать его без дополнительных настроек в системном лоадере ld.so.

Насколько я знаю PG выбирает относительно универсальный (что ли) способ сборки. Пути не внедряются, оставляя все на откуп настройкам системы. Это вроде как более гибкий подход к формированию большого Linux-дистрибутива (хотя PG поддерживает соответствующий флаг конфигурирования сборки --disable/enable-rpath, который позволяет привязаться к конкретной libdir для последующего поиска библиотек). В linux чуть проще, хотя и присутствует проблема dll-hell/dependecy-hell, в отличие от windows.

Поэтому, если хотите собрать на одной машине, а потом использовать на другой - это возможно.
Библиотеки можно переносить и будет поддерживаться бинарная совместимость (до определенного момента, конечно), и даже возможно ничего не будет падать.
Но, все равно, любая подмена файлов на проде в обход системных - это риск поломать работу системы и сложность последующей установки обновлений. Не знаю, что там у вас за пакеты питоновсикие такие, которые требуют только самый свежий питон, но лучше уже откатиться на ту версию питона, которая нативно поддерживается вашей системой, а все эти эксперименты оставить для девелоперских и тестовых стендов.
...
Рейтинг: 0 / 0
Модуль plPython3u (переход на новую версию из tgz)
    #40125742
ronvaleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
grgdvo,

Согласен, не лучшее решение для прода. И таки да, это больше для тестового сервера, который потом подменим свежим, но в данный момент обновить систему не предлставляется возможным. Еще раз благодарю за подробную информацию.))
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Модуль plPython3u (переход на новую версию из tgz)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]