我在plpython3
上的postgres
数据库上安装了MacOS
存储功能(已安装标准Enterprise DB软件包)。
我可以导入标准的python包,例如:
CREATE OR REPLACE FUNCTION foo(x double precision)
RETURNS double precision
LANGUAGE plpython3u
AS $$
import math
...
$$
我不能,但是导入我安装在我机器上常规python3目录中的软件包,该目录由brew定义:
$ which python3
/usr/local/bin/python3
因此import foo
即使在常规的python3环境中也无法正常工作。
在运行PostgreSQL
时,plpython3u
服务器是否可能没有使用与我相同的python3环境? (也许它使用的是python3解释器,这是MacOS
等的标准问题。)如何检查该事件以及如何纠正配置?
事实上,我创建了一个存储函数get_py
,该函数执行以下操作:
import os
return os.popen('which python').read()
它返回:
> select get_py()
+-----------------+
| get_py |
|-----------------|
| /usr/bin/python |
+-----------------+
(which python3
不适用)。这似乎表明它没有使用我想要的解释器!
我该如何更改?
PostgreSQL 11.5
上的x86_64-apple-darwin
virtualenv
。答案 0 :(得分:1)
除了shell脚本(pg_service.sh)中的其他环境变量(如PGDATA
)之外,还要设置PYTHONPATH='/path/to/python:/path/to/your/module'
例如猫/Users/postgres/pg_service.sh
export PGDATABASE=postgres
export PGUSER=postgres
export PGPORT=5432
export PATH=/Library/PostgreSQL/11/bin:$PATH
export PGLOCALEDIR=/Library/PostgreSQL/11/share/locale
export PYTHONUSERBASE=/Users/postgres/packaging_tutorial
export PYTHONPATH=/Library/edb/languagepack-11/Python-3.6:$PYTHONUSERBASE
pg_ctl -D /Library/PostgreSQL/11/data -l /Users/postgres/logfile $1
启动服务器:
> sudo -u postgres /Users/postgres/pg_service.sh start
waiting for server to start.... done
server started
/Users/postgres/packaging_tutorial/example_pkg/__init__.py
:
def retpy3():
return 7/5
pg函数:
CREATE OR REPLACE FUNCTION expy3()
RETURNS text
LANGUAGE plpython3u
AS $$
import example_pkg
return example_pkg.retpy3()
$$;
输出
psql -c 'select * from expy3()';
expy3
--------
1.4