PostgreSQL PL/Python:在virtualenv中调用存储过程

PostgreSQL PL/Python:在virtualenv中调用存储过程,python,postgresql,stored-procedures,virtualenv,plpython,Python,Postgresql,Stored Procedures,Virtualenv,Plpython,在Python应用程序中调用PostgreSQL PL/Python存储过程时,它似乎是在一个单独的进程中执行的,该进程以用户postgres的身份运行。到目前为止,这只产生了一个副作用,即我必须使我的日志文件对我自己和数据库用户都是可写的,这样应用程序和存储过程都可以对其进行写入 但是现在,我开始使用并向我的~/.virtualenvs/virt_env/lib/python2.7/site packages/文件夹添加了许多.pth文件,这些文件将模块的路径添加到Python路径中 执行存储

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

但是现在,我开始使用并向我的
~/.virtualenvs/virt_env/lib/python2.7/site packages/
文件夹添加了许多
.pth
文件,这些文件将模块的路径添加到Python路径中

执行存储过程时,用户
postgres
与我不在同一虚拟环境中,因此存储过程找不到我的模块。我可以在中修改
PYTHONPATH
,但每次切换虚拟环境时我都必须更改它-这有点违背了VirtualEnvironment的目的

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

更新


A已被要求修改Postgres中的PYTHONPATH环境变量;但似乎,;至少,这在Mac OSX上不是一个可行的解决方案。

通常我会说这不是一个好主意,但你可以遵循


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

事实证明,有一种方法可以做到这一点。从1.6版开始,virtualenv附带了一个脚本
activate\u 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
(由于默认情况下路径在plpython os.environ中不可用,因此需要额外的路径mungery- 激活_this.py有一个应与下一个点版本(应为1.11.7或1.12)一起滚动的


(主要取自)

我不确定此virtualenv路径在多个plpython调用中是否保持活动状态,因为每次调用时解释器都是新的。我想您假设我们从一开始就从所有plpython方法调用workon(),实际上,在一个会话(db连接)中所有plpython函数都共享一个解释器,尽管它们获得了新的执行状态(全局GD数据共享字典除外)——您不会为每个查询启动新的解释器。不要多次调用它,sys.path将继续增长