使用 python 2.7 在 mac 上安装 plpython

Install plpython on mac with python 2.7

我需要安装 plpython 因为我遇到了错误

could not access file "$libdir/plpython2": No such file or directory

尝试执行 python manage.py 迁移时。我看到了关于如何安装此软件包的不同建议,但 none 对我有用,因为我需要使用 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。但没有结果。有什么建议吗?

如果有人遇到同样的问题,我通过卸载 postgres 并使用 brew install postgres --with-python

安装来解决这个问题

呃,这真的很痛苦,因为他们删除了 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

可能有更好的方法,但这对我有用。

我为最新的postgresql(11.2)快速创建了一个tap公式,添加了一个--with-python选项来编译选项。到目前为止它的工作。没有二进制版本,只能从源代码编译。 使用它:

brew tap indlin/postgresql-py
brew install postgresql-py

如果我没理解错的话,这是在 brew 中更改选项的官方路径(创建您自己的水龙头公式)。我不明白他们为什么要这么做???

(macOS Catalina 10.15.5,自制软件 2.3.0)

投票的解决方案不适用于 Homebrew 的最新版本,后者不再支持选项,请参阅 https://github.com/Homebrew/homebrew-core/issues/31510

> brew reinstall postgresql@9.4 --with-python
...
Error: invalid option: --with-python

还好还有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 为我起死回生。

非常感谢@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 的环境变量添加到安装块的 args 列表中。我对当前主人的差异是:

@@ -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.

其次创建一个包含您的 dB 的目录并在该目录中打开一个终端。

第三次构建所需的图像。创建一个 Dockerfile 告诉 Docker 图像应该是什么样子。这就是我用来指定我想要一个容器 运行 一个 postgres 数据库并将 python3 作为过程语言扩展包括在内(尽管您可以指定 python2)。请注意,我指定了我想要的 postgres 版本 (13) 和兼容的 plpython3 (也是 13)。 我还包括对 'requirements' 文件的引用(请参阅下一步):

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

第四,是一个可选步骤,用于指定任何其他 libraries/packages/modules 感兴趣的内容。这些可以放在 'requirements.txt' 文件中。如果您没有任何要求,只需删除 Dockerfile 中引用它们的行。如果您确实有要求,请创建一个 'requirements.txt' 文件。在我的例子中,我希望图像也包括 'pandas' 和 'networkx'。我的文件看起来像(是的,两行文本):

pandas>=1.3.5
networkx>=2.0

第五,在终端的命令行 运行 docker build -t xxx .-t xxx 是您为图像指定的名称,. 表示 Docker 文件位于当前目录中。瞧,你现在有一个名为 'xxx' 的 postgres 图像,其中包含 postgres/python3/plpython3/pandas/networkx 在我的例子中,我使用的标签是 'postgresql-plpython3-13'.

要使用图像,您可以使用 docker-compose up -d 启动它,该命令将根据位于目录中的 docker-compose.yml 启动图像。是的,还要创建一个文本文件。我的看起来像这样:

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 的容器,其中包含您在其中创建 运行ning 的 postgres 图像。该数据库可以连接到端口 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
  4. 关闭

补充说明:

  • 如果您按照所有步骤操作,您将拥有一个目录:一个名为 Dockerfile 的文件、一个名为 requirements.txt 的文件、一个名为 docker-compose.yml 的文件和一个 sub-directory 与 db.
  • 整洁的东西,添加一个 'readme' 文件并压缩目录。现在您可以向拥有 Docker 的其他人提供您的完整数据库。