You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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服务的环境变量配置:

  1. 编辑PostgreSQL 13的环境配置文件:
sudo vim /etc/postgresql/13/main/environment
  1. 新增一行配置,添加你的私有包路径:
PYTHONPATH = '/home/my_user/.local/lib/python3.8/site-packages'
  1. 保存后重启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:45:02