Установите 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все будет так, как было, когда вы закрылись.

Резюме:

  1. построить желаемый образ с файлом требований или без него
  2. составить соответствующий файл docker-compose.yml
  3. запустить БД с docker-compose up, закрыть с docker-compose down

Дополнительные примечания:

  • Если вы выполните все шаги, у вас будет каталог с: файлом с именем Dockerfile, файл с именем requirements.txt, файл с именем docker-compose.yml, и подкаталог с файлом db.
  • Отлично, добавьте файл «readme» и заархивируйте каталог. Теперь вы можете предоставить кому-то еще, у кого есть Docker, вашу полную базу данных.
Другие вопросы по тегам