如何为postgres pl/python安装第三方模块?

kak*_*eys 19 postgresql plpython

我需要在pl/python函数中导入第三方模块.似乎pl/python使用的内部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
Run Code Online (Sandbox Code Playgroud)

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

Adr*_*ian 21

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

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


小智 15

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

from sys import path
path.append( '/path/to/your/module' )
Run Code Online (Sandbox Code Playgroud)


小智 5

对我来说,这是关于了解 Python Postgres 正在查看哪个版本,然后安装到 /local/lib 目录,而不是 Postgres 无法识别的 .local 目录。

在 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
Run Code Online (Sandbox Code Playgroud)

使用以下命令执行函数:

select python_version()
Run Code Online (Sandbox Code Playgroud)

在Python中:

import sys
sys.version
Run Code Online (Sandbox Code Playgroud)

脚本和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>
Run Code Online (Sandbox Code Playgroud)

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