我需要在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
如何将模块安装到pl / python中,以便我可以从存储过程代码中导入它?
答案 0 :(得分:20)
pl / python可以访问普通Python解释器所具有的所有模块,只要它们位于服务器上的$PYTHONPATH
(以及运行postgres服务的用户)。如果在服务器上的Python解释器中运行它,import lucene
是否有效?
如果您的模块安装在其他地方(例如,不是dist-packages等),那么您需要在服务器上编辑/etc/postgresql/9.1/main/environment
(调整到PostgreSQL版本)文件并添加类似{{1 }}。
答案 1 :(得分:14)
由于修改postgres用户的PYTHONPATH可能需要重新启动服务器,因此通过
从Python中添加路径会更容易一些from sys import path
path.append( '/path/to/your/module' )
答案 2 :(得分:0)
对我来说,这是关于了解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
使用以下命令执行功能:
select python_version()
在Python中:
import sys
sys.version
脚本和Python都说: 信息: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#