在plpython3u过程中导入Python包时出现“找不到模块”

fra*_*lau 5 python postgresql macos python-3.x plpython

plpython3postgres数据库上使用存储功能MacOS(已安装标准Enterprise DB软件包)。

我可以导入标准的python包,例如:

CREATE OR REPLACE FUNCTION foo(x double precision)
RETURNS double precision
LANGUAGE plpython3u
AS $$
import math
...
$$
Run Code Online (Sandbox Code Playgroud)

但是,我无法导入安装在我机器上常规python3目录中的安装包,该目录由brew定义:

$ which python3
/usr/local/bin/python3
Run Code Online (Sandbox Code Playgroud)

import foo即使它在常规python3环境中也可以,所以将无法工作。

PostgreSQL运行时服务器是否可能没有使用与我相同的python3环境plpython3u?(也许它正在使用python3解释器,这是MacOS等问题的标准问题。)在这种情况下,我该如何检查以及如何更正配置?

实际上,我创建了一个get_py执行以下操作的存储函数:

import os
return os.popen('which python').read()
Run Code Online (Sandbox Code Playgroud)

它返回:

> select get_py()
+-----------------+
| get_py          |
|-----------------|
| /usr/bin/python |
+-----------------+
Run Code Online (Sandbox Code Playgroud)

(对于则一无所有which python3)。这似乎表明它没有使用我想要的解释器!

我该如何改变?

配置信息

  • PostgreSQL 11.5x86_64-apple-darwin,苹果LLVM 6.0版本编译
  • 我在virtualenv这里不使用任何东西。

ama*_*var 1

除了PGDATAshell 脚本 (pg_service.sh) 中的其他环境变量之外,还应设置PYTHONPATH='/path/to/python:/path/to/your/module'

例如 cat /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
Run Code Online (Sandbox Code Playgroud)

启动服务器:

> sudo -u postgres /Users/postgres/pg_service.sh start
waiting for server to start.... done
server started 
Run Code Online (Sandbox Code Playgroud)

/Users/postgres/packaging_tutorial/example_pkg/__init__.py:

def retpy3():
    return 7/5
Run Code Online (Sandbox Code Playgroud)

PG函数:

CREATE OR REPLACE FUNCTION expy3()
RETURNS text
LANGUAGE plpython3u
AS $$
import example_pkg
return example_pkg.retpy3()
$$;
Run Code Online (Sandbox Code Playgroud)

输出

psql  -c 'select * from expy3()';
 expy3
--------
 1.4
Run Code Online (Sandbox Code Playgroud)