Установите plpython на Mac с Python 2.7
Мне нужно установить plpython, потому что я получаю сообщение об ошибке
could not access file "$libdir/plpython2": No such file or directory
при попытке сделать Python manage.py мигрировать. Я видел разные предложения о том, как установить этот пакет, но ни один не работает для меня, потому что мне нужно использовать Python версии 2.7 (некоторые люди предлагали установить Python 3.2), и я не могу запустить sudo apt-get install..., потому что я должен быть работает на Mac.
Я пробовал бегать
CREATE LANGUAGE plpython2u;
но я получил ошибку
ERROR: could not access file "$libdir/plpython2": No such file or directory
Также я попробовал pip/brew install plpython
, Но нет результата. Какие-либо предложения?
6 ответов
Если у кого-то есть такая же проблема, я исправил это, удалив postgres и установив его, используя brew install postgres --with-python
Я быстро создаю формулу касания для последней версии postgresql (11.2), добавляю опцию --with-python для компиляции опций. Пока это работа. Нет бинарной версии, только скомпилировать из источника. Чтобы использовать это:
brew tap indlin/postgresql-py
brew install postgresql-py
Если я правильно понимаю, это официальный путь для изменения параметров в brew (создайте свою собственную формулу нажатия). Я не понимаю, почему они это делают???
(macOS Catalina 10.15.5, Homebrew 2.3.0)
Проголосованное решение не работает с последними версиями Homebrew, которые больше не поддерживают параметры, см. https://github.com/Homebrew/homebrew-core/issues/31510.
> brew reinstall postgresql@9.4 --with-python
...
Error: invalid option: --with-python
К счастью, есть https://github.com/petere/homebrew-postgresql
Сначала я обновил инструменты команды XCode, чтобы избежать этой ошибки:
configure: error: header file <perl.h> is required for Perl
с
> sudo rm -rf /Library/Developer/CommandLineTools
> sudo xcode-select --install
А потом
> brew tap petere/postgresql
> brew reinstall petere/postgresql/postgresql@9.4
вернул мне plpython2 к жизни.
Тьфу, это была настоящая боль, так как они убрали with-python@2
вариант. Мне удалось установить его с помощью следующих шагов:
git clone https://github.com/Homebrew/homebrew-core.git
cd homebrew-core/
git checkout c2c0659f5a2e5be9c54c214e5aa19a2fe2cdc374
brew install --build-from-source ./Formula/postgresql@9.5.rb --with-python@2
brew services restart postgresql@9.5
Возможно, есть лучший способ, но это сработало для меня.
Большое спасибо @facetoe; к сожалению, как говорили другие, эта фиксация лишила функциональности https://github.com/Homebrew/homebrew-core/commit/c55743ce2e993d3407a7f7932abfe4910a25f953#diff-c290cd53a44f82f9ba1f4d59d9f90140. В конечном итоге я хочу получить последнюю версию только с python; Самый быстрый способ для меня был:
git clone https://github.com/Homebrew/homebrew-core.git
cd homebrew-core/
vi Formula/postgresql.rb
здесь вам нужно добавить в блок установки переменную окружения для python и
--with-python
в список аргументов. Моя разница с текущим мастером:
@@ -38,6 +38,7 @@ class Postgresql < Formula
def install
ENV.prepend "LDFLAGS", "-L#{Formula["openssl@1.1"].opt_lib} -L#{Formula["readline"].opt_lib}"
ENV.prepend "CPPFLAGS", "-I#{Formula["openssl@1.1"].opt_include} -I#{Formula["readline"].opt_include}"
+ ENV["PYTHON"] = which("python3")
args = %W[
--disable-debug
@@ -56,6 +57,7 @@ class Postgresql < Formula
--with-libxslt
--with-openssl
--with-pam
+ --with-python
--with-perl
--with-tcl
--with-uuid=e2fs
Затем, наконец, вы хотите установить его с помощью:
brew install --build-from-source ./Formula/postgresql.rb
sudo install_name_tool -change @rpath/Python3.framework/Versions/3.8/Python3 /usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/Python /usr/local/lib/postgresql/plpython3.so
brew services start postgresql
Работая с этим в нескольких средах, я обнаружил, что проще запускать postgres в контейнере Docker, используя модифицированный образ postgres. Ниже приведены простые шаги для этого.
Сначала установите Докер.
Во-вторых, создайте каталог для хранения вашего дБ и откройте терминал в этом каталоге.
Третье соберите нужный образ. Создайте , который сообщает Docker, как должно выглядеть изображение. Это то, что я использую, чтобы указать, что мне нужен контейнер с базой данных postgres, и включить python3 в качестве расширения процедурного языка (хотя вы можете указать python2). Обратите внимание, что я указываю нужную версию postgres (13) и совместимый plpython3 (тоже 13). Я также включаю ссылку на файл «требований» (см. следующий шаг):
FROM postgres:13
RUN apt-get update
RUN apt-get -y install python3 postgresql-plpython3-13
RUN apt-get -y install python3-pip
RUN apt-get clean && \
rm -rf /var/cache/apt/* /var/lib/apt/lists/*
# Requirements installation
COPY requirements_dockerbuild13.txt /tmp/
RUN python3 -m pip install --upgrade pip
RUN python3 -m pip install --requirement /tmp/requirements_dockerbuild13.txt
В-четвертых, это необязательный шаг для указания любых дополнительных интересующих библиотек/пакетов/модулей. Их можно поместить в файл «requirements.txt». Если у вас нет никаких требований, просто удалите строку, относящуюся к ним, в файле . Если у вас есть требования, создайте файл «requirements.txt». В моем случае я хотел, чтобы изображение также включало «панды» и «networkx». Мой файл выглядит так (да, две строки текста):
pandas>=1.3.5
networkx>=2.0
В-пятых, в командной строке вашего терминала запустите
docker build -t xxx .
. В
-t xxx
это имя, которое вы даете изображению и
.
означает, что Dockerfile находится в текущем каталоге. Вуаля, теперь у вас есть изображение postgres с именем «xxx», которое содержит postgres/python3/plpython3/pandas/networkx. В моем случае я использовал тег «postgresql-plpython3-13».
Чтобы использовать образ, вы запускаете его с помощью, и эта команда запустит образ в соответствии с находящимся в каталоге. Да, еще один текстовый файл для создания. Моя выглядела так:
version: "3"
services:
postgres:
image: postgresql-plpython3-13 <--- name of the image just created
container_name: cain_db <--- arbitrary name of container running image
command: ["-c", "logging_collector=on","-c", "log_statement=all"]
volumes:
- ./caindata:/var/lib/postgresql/data <--- *comments below*
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=cain_data <---- name of db
ports:
- 5566:5432 <--- making the db available on port 5566 instead of 5432
volumes:
caindata: <--- name of the volume
Этот файл docker-compose заставляет docker запускать контейнер с именем cain_db, внутри которого работает созданный вами образ postgres. Этот db может быть подключен к порту 5566, порту, который я выбрал, чтобы он отличался от порта postgres по умолчанию (я мог бы использовать 5432). База данных будет называться «cain_data», и вот что важно: база данных будет находиться в папке в текущем каталоге с именем «caindata», а не в /var/lib/postgresql/data, куда ее поместит MacOS.
Чтобы закрыть контейнер, используйте
docker-compose down --remove-orphans
. База данных сохранится и при запуске
docker-compose up -d
все будет так, как было, когда вы закрылись.
Резюме:
- построить желаемый образ с файлом требований или без него
- составить соответствующий файл docker-compose.yml
- запустить БД с
docker-compose up
, закрыть сdocker-compose down
Дополнительные примечания:
- Если вы выполните все шаги, у вас будет каталог с: файлом с именем
Dockerfile
, файл с именемrequirements.txt
, файл с именемdocker-compose.yml
, и подкаталог с файлом db. - Отлично, добавьте файл «readme» и заархивируйте каталог. Теперь вы можете предоставить кому-то еще, у кого есть Docker, вашу полную базу данных.