3

当我在我的 Python 应用程序中调用 PostgreSQL PL/Python 存储过程时,它似乎是在以 user 身份运行的单独进程中执行的postgres。到目前为止,这只产生了我必须让我的日志文件对我自己和数据库用户都可写的副作用,因此应用程序和存储过程都可以写入它。

然而,现在,我开始使用virtualenv并将一些.pth文件添加到我的~/.virtualenvs/virt_env/lib/python2.7/site-packages/文件夹中,这些文件将我的模块的路径添加到 Python 路径中。

执行存储过程时,用户postgres和我不在同一个虚拟环境中,所以存储过程找不到我的模块。我可以PYTHONPATH全局 PostgreSQL 环境中进行修改,但每次切换虚拟环境时都必须更改它——这有点违背 virtualenv 的目的......

如何扩展存储过程的 Python 路径?

更新

已经提出了一个类似的问题,解决方案是修改 Postgres 中的 PYTHONPATH 环境变量;但是,似乎没有为 PostgreSQL 指定环境变量的标准方法;至少,它在 Mac OSX 上不是一个可行的解决方案。

4

2 回答 2

3

事实证明,有一种方法可以做到这一点。从 1.6 或更高版本开始,virtualenv 带有一个脚本activate_this.py,可用于设置现有解释器以访问该特定 virtualenv。

exec(open('/Some/VirtualEnv/Directory/myvirtualenv/bin/activate_this.py').read(), 
dict(__file__='/Some/VirtualEnv/Directory/myvirtualenv/bin/activate_this.py'))

并且作为一个完全实现的plpython函数:

CREATE OR REPLACE FUNCTION workon(venv text)
  RETURNS void AS
$BODY$
    import os
    import sys

    if sys.platform in ('win32', 'win64', 'cygwin'):
        activate_this = os.path.join(venv, 'Scripts', 'activate_this.py')
    else:
        if not os.environ.has_key('PATH'):
            import subprocess
            p=subprocess.Popen('echo -n $PATH', stdout=subprocess.PIPE, shell=True)
            (mypath,err) = p.communicate()
            os.environ['PATH'] = mypath

        activate_this = os.path.join(venv, 'bin', 'activate_this.py')

    exec(open(activate_this).read(), dict(__file__=activate_this))
$BODY$
LANGUAGE plpythonu VOLATILE

(需要额外的 PATH mungery,因为默认情况下 PATH 在 plpython os.environ 中不可用 - activate_this.py 已检查了一个修复程序,该修复程序应该在下一个版本发布(应该是 1.11.7 或 1.12)

(主要取自https://gist.github.com/dmckeone/69334e2d8b27f586414a

于 2014-07-22T16:03:47.253 回答
2

通常我会说这不是一个好主意,但你也许可以关注这个问题

您可以做的是在不同的环境中运行多个 PostgreSQL 实例,以允许进行各种PYTHONPATH设置。

于 2012-03-06T16:18:24.330 回答