如何在Linux上安装Python包使其被PostgreSQL 13 plpython3u扩展识别
问题原因
你使用普通用户身份安装pandas时,包默认被安装到当前用户的私有site-packages目录/home/my_user/.local/lib/python3.8/site-packages。而PostgreSQL的plpython3u扩展运行时使用postgres系统用户身份,默认不会加载普通用户的私有包路径,因此无法识别已安装的第三方包。
解决方案
方案1:全局安装Python包(推荐)
使用sudo权限将依赖包安装到系统全局Python路径,所有用户均可访问:
sudo python3.8 -m pip install pandas scikit-learn
安装完成后重启PostgreSQL服务即可生效:
sudo service postgresql restart
方案2:存储过程内手动添加包路径
如果不需要全局安装,可在存储过程开头手动将你的私有包路径加入Python搜索路径:
CREATE OR replace FUNCTION kmeans(input_table text, columns text[], clus_num int) RETURNS bytea AS $$ import sys # 加入普通用户的私有包路径 sys.path.append('/home/my_user/.local/lib/python3.8/site-packages') from pandas import DataFrame from sklearn.cluster import KMeans from pickle import dumps # 其余原有代码保持不变 all_columns = ",".join(columns) if all_columns == "": all_columns = "*" rv = plpy.execute('SELECT %s FROM %s;' % (all_columns, plpy.quote_ident(input_table))) frame = [] for i in rv: frame.append(i) df = DataFrame(frame).astype('float') kmeans = KMeans(n_clusters=clus_num, random_state=0).fit(df._get_numeric_data()) return dumps(kmeans) $$ LANGUAGE plpython3u;
注:需确保postgres用户对/home/my_user/.local/lib/python3.8/site-packages路径有读权限。
方案3:全局配置Python搜索路径
如果需要所有plpython3u存储过程都能识别自定义路径,可修改PostgreSQL服务的环境变量配置:
- 编辑PostgreSQL 13的环境配置文件:
sudo vim /etc/postgresql/13/main/environment
- 新增一行配置,添加你的私有包路径:
PYTHONPATH = '/home/my_user/.local/lib/python3.8/site-packages'
- 保存后重启PostgreSQL服务生效:
sudo service postgresql restart
验证方法
可执行以下函数查看plpython3u当前的搜索路径,确认目标路径是否已被加载:
CREATE OR REPLACE FUNCTION get_sys_path() RETURNS TEXT[] AS $$ import sys return sys.path $$ LANGUAGE plpython3u; SELECT get_sys_path();
内容的提问来源于stack exchange,提问作者questionto42
相关产品推荐
相关产品推荐

