PostgreSQL PL / Python: procedimiento almacenado de llamadas en virtualenv

Cuando llamo a un procedimiento almacenado de PostgreSQL PL / Python en mi aplicación Python, parece que se ejecuta en un proceso separado que se ejecuta como usuario postgres . Hasta ahora, esto solo tenía el efecto secundario de que tenía que hacer que mi archivo de registro fuera grabable tanto para mí como para el usuario de la base de datos, por lo que tanto la aplicación como el procedimiento almacenado pueden escribirle.

Ahora, sin embargo, comencé a usar virtualenv y agregué varios archivos .pth a mi ~/.virtualenvs/virt_env/lib/python2.7/site-packages/ que agregan las rutas a mis módulos en la ruta de Python.

Cuando se ejecuta el procedimiento almacenado, el usuario postgres no se encuentra en el mismo entorno virtual que yo, por lo que el procedimiento almacenado no encuentra mis módulos. Puedo modificar PYTHONPATH en el entorno global de PostgreSQL , pero tengo que cambiar eso cada vez que cambio los entornos virtuales, lo cual es un poco contra el propósito de virtualenv …

¿Cómo puedo extender la ruta de Python para procedimientos almacenados?

ACTUALIZACIÓN :

Se hizo una pregunta similar y la resolución fue modificar la variable de entorno PYTHONPATH en Postgres; sin embargo, parece que no hay una manera estándar de especificar variables de entorno para PostgreSQL ; Al menos, no es una solución viable en Mac OSX.

Hay una manera de hacerlo, como resulta. Desde la versión 1.6 o desde allí, virtualenv viene con un script activate_this.py , que puede usarse para configurar un intérprete existente para acceder a ese virtualenv en particular.

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

Y como una función plpython completamente realizada:

 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 

(Se necesita el mungery PATH adicional, ya que, de forma predeterminada, PATH no está disponible en plpython os.environ – activar_este.py tiene una solución registrada que debería rodar con el siguiente lanzamiento de punto (que debería ser 1.11.7 o 1.12)

(tomado principalmente de https://gist.github.com/dmckeone/69334e2d8b27f586414a )

Normalmente diría que no es realmente una buena idea, pero es posible que pueda seguir esta pregunta .

Lo que podría hacer es ejecutar varias instancias de PostgreSQL con diferentes entornos para permitir varias configuraciones de PYTHONPATH .