【问题标题】:How to install 3rd party module for postgres pl/python?如何为 postgres pl/python 安装 3rd 方模块?
【发布时间】:2011-12-23 08:31:42
【问题描述】:

我需要在我的 pl/python 函数中导入一个第 3 方模块。 似乎 pl/python 使用了一个没有任何 3rd 方模块的内部 python。

我收到这种错误:

ERROR:  PL/Python: PL/Python function "to_tsvector_luc" failed
DETAIL:  <type 'exceptions.ImportError'>: No module named lucene

********** Error **********

ERROR: PL/Python: PL/Python function "to_tsvector_luc" failed
SQL state: XX000
Detail: <type 'exceptions.ImportError'>: No module named lucene

如何将模块安装到 pl/python 中,以便可以从存储过程代码中导入它?

【问题讨论】:

  • 如您所见,plpython3u 使用系统 Python 和系统 site-packages 而不是本地(用户)包。这是有意义的,因为它在系统服务 Postgres 服务器中运行。

标签: postgresql plpython


【解决方案1】:

pl/python 可以访问普通 Python 解释器拥有的所有模块,只要它们位于服务器上的 $PYTHONPATH 中(以及运行 postgres 服务的用户)。如果您在服务器上的 Python 解释器中运行 import lucene 是否有效?

如果您的模块安装在其他地方(例如,不是 dist-packages 等),那么您需要在服务器上编辑您的 /etc/postgresql/9.1/main/environment(调整到您的 PostgreSQL 版本)文件并添加类似 PYTHONPATH='&lt;path to your module&gt;' 的内容。

【讨论】:

  • /etc/postgresql/9.1/main/environment 似乎只在 Ubuntu 上存在,请参阅 here
  • 关于plpython3u? (今天使用pg13)... 1.通过print(a_module.__file__)检查模块的路径,是吗? 2. [$PYTHONPATH](postgresql.org/docs/current/plpython-envar.html) 对于 Python3 来说似乎是一样的,是吗? 3. 但是关于很多模块?还有一个由pip 安装的模块,但在/home/myUser ...请扩展有关现代(2021)详细信息的答案
【解决方案2】:

由于修改 postgres 用户的 PYTHONPATH 可能需要重新启动服务器,因此从 Python 中添加路径会更容易,通过

from sys import path
path.append( '/path/to/your/module' )

【讨论】:

  • 不工作... 需要添加import moduleX 子句?关于路径,您看到__init__.py 的文件夹是print(a_module.__file__)?我通过 pip 安装了 chevron 并获得了用户区路径 /home/myUser/.local/lib/python3.8/site-packages/chevron/ ,是否有效?没有 PostgreSQL 服务器访问路径问题?
【解决方案3】:

对我来说,关键是要知道 Python Postgres 是哪个版本 查看然后安装到 /local/lib 目录而不是 .local 目录在 Postgres 中无法识别。

在 Postgres 中,创建了这个函数来识别它的 Python 版本 正在使用: .

CREATE OR REPLACE FUNCTION python_version()
    RETURNS pg_catalog.text AS $BODY$

    import sys
    plpy.info(sys.version)    
    return 'finish'
    $BODY$
LANGUAGE plpython3u VOLATILE SECURITY DEFINER

使用以下命令执行函数:

select python_version()

在 Python 中:

import sys
sys.version

脚本和 Python 都说: INFO:3.7.3(默认,2019 年 8 月 20 日,17:04:43)

pip3 install 将库放到这个目录中: /home/username/.local/lib/python3.7/site-packages

使包对所有用户(包括 Postgres)可用。 我用过umask:

sudo su
cd ~
umask 022
pip3 install <package name>

注意:软件包安装在: /usr/local/lib# cd python3.7/dist-packages 不在 /usr/lib/python3/dist-packages#

【讨论】:

  • 是的,需要带有 sudorunmask 022 的丑陋 pip3 程序。
【解决方案4】:

我认为 43 pl/python 可以访问普通 Python 解释器将拥有的所有模块,只要它们位于服务器上的 Pythonpath 和使用 的用户中PostgreSQL.

如果您的模块安装在其他地方(例如软件包),那么您需要在服务器上编辑 /src/postgresql/9.1/main/environment(调整到您的 PostgreSQL 版本)文件并添加类似 的内容Pythonpath=>*'你的模块的路径'**。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    相关资源
    最近更新 更多