【问题标题】:"Module not found" when importing a Python package within a plpython3u procedure在 plpython3u 过程中导入 Python 包时出现“未找到模块”
【发布时间】:2019-09-03 14:52:44
【问题描述】:

我在MacOS 上的postgres 数据库上使用plpython3 存储函数(与标准企业数据库包一起安装)。

我可以导入标准的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 环境中工作。

在运行plpython3u 时,PostgreSQL 服务器是否可能没有使用与我相同的 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 on x86_64-apple-darwin,由 Apple LLVM 6.0 版编译
  • 我在这里没有使用任何virtualenv

【问题讨论】:

    标签: python python-3.x postgresql macos plpython


    【解决方案1】:

    除了其他环境变量,如 shell 脚本 (pg_service.sh) 中的 PGDATA,设置 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
    

    启动服务器:

    > 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
    

    【讨论】:

    • 谢谢:我在 Mac 上,我确实看到了 PYTHONPATH=/Library/edb/languagepack-11/Python-3.6。它是什么? Python的Postgres实现? (plpython3u?)
    • From the docs 语言包安装程序包含可与 EDB Postgres Advanced Server 和 EnterpriseDB PostgreSQL 数据库安装程序一起使用的受支持语言。语言包安装程序允许您安装 Perl、TCL/TK 和 Python,而无需安装来自第三方供应商的支持软件。 Python 3.6.8 版
    • 我完成了上述过程(我必须从:sudo -u postgres pg_ctl -D /Library/PostgreSQL/11/data start 开始)。不幸的是,当尝试运行CREATE OR REPLACE FUNCTION 时,我得到:could not access file "$libdir/plpython3": No such file or directory(换句话说,plpython3 现在似乎坏了?)我做错了什么?注意:echo $PYTHONPATH 回馈:/Library/edb/languagepack-11/Python-3.6:/my/path/hello.py
    • 是的,我能够复制它。该错误意味着 PYTHONPATH 变量不可用于 pg_ctl 命令。我已经编辑了答案以包含启动服务器的脚本和 sudo 命令。
    • @refriedjello 它也可以在 CentOS 7 rpm 中用于 postgres postgresql.org/docs/current/plpython-envar.html
    猜你喜欢
    • 2019-12-13
    • 2023-03-15
    • 2019-07-03
    • 2020-08-11
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 2021-07-04
    相关资源
    最近更新 更多