我需要在我的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中,以便可以从存储过程代码中导入它?
5条答案
按热度按时间i86rm4rw1#
pl/python可以访问普通Python解释器拥有的所有模块,只要它们位于服务器上的
$PYTHONPATH
中(以及运行postgres服务的用户)。如果在服务器上的Python解释器中运行import lucene
,它能工作吗?如果您的模块安装在其他地方(例如不是dist-packages等),那么你需要在服务器上编辑你的
/etc/postgresql/9.1/main/environment
(调整到你的PostgreSQL版本)文件,并添加类似PYTHONPATH='<path to your module>'
的东西。elcex8rz2#
由于修改postgres用户的PYTHONPATH可能需要重新启动服务器,因此在Python中通过
euoag5mw3#
对我来说,这是关于知道Python Postgres正在查看哪个版本,然后安装到/local/lib目录,而不是Postgres中无法识别的.local目录。
在Postgres中,创建了这个函数来识别它使用的Python版本:.
使用以下命令执行函数:
在Python中:
脚本和Python都说:信息:3.7.3(默认,2019年8月20日17:04:43)
pip 3 install将库放置在此目录中:/home/username/.local/lib/python3.7/site-packages
让所有用户(包括Postgres)都可以使用这个包。我使用了umask:
注:软件包安装在:/usr/local/lib# cd python3.7/dist-packages不在/usr/lib/python3/dist-packages#
13z8s7eq4#
我认为43 pl/python可以访问普通Python解释器所拥有的所有模块,只要它们位于使用PostgreSQL的服务器和用户的Pythonpath中。
如果您的模块安装在其他地方(例如包),那么你需要在服务器上编辑你的/src/postgresql/9.1/main/environment(调整到你的PostgreSQL版本)文件,并添加类似Pythonpath=>*'path to your module'**的内容。
doinxwow5#
对于Ubuntu 22.04:
sudo pip install foo
./usr/local/lib/python3.10/dist-packages/
-显然python3.10
是你安装的python版本。如果您的路径不同,命令pip3 show <your package name here>
应该可以帮助您。例如:pip3 show numpy
。postgres
用户身份运行,但模块的文件将属于root
。你应该做:sudo chmod -R 755 <path to your module>
。例如:sudo chmod -R 755 /usr/local/lib/python3.10/dist-packages/test_module
。现在你的模块应该可以工作了。