2012-03-06 35 views
3

在我的Python應用程序中調用PostgreSQL PL/Python存儲過程時,它似乎在以用戶postgres運行的單獨進程中執行。到目前爲止,這隻會產生副作用,我不得不讓我的日誌文件對數據庫用戶可寫,所以應用程序和存儲過程都可以寫入它。PostgreSQL PL/Python:在virtualenv中調用存儲過程

但是現在,我開始使用virtualenv並增加了許多.pth文件到我的~/.virtualenvs/virt_env/lib/python2.7/site-packages/文件夾的路徑添加到我的模塊添加到Python路徑。

執行存儲過程時,用戶postgres與我不在同一個虛擬環境中,所以存儲過程找不到我的模塊。我可以在global PostgreSQL environment修改PYTHONPATH,但我不得不改變我每次切換虛擬環境 - 這是有點反對的virtualenv目的...

如何延長爲存儲過程Python路徑?

UPDATE

一個similar question已被要求和分辨率有修改的Postgres PYTHONPATH環境變量;然而,似乎there is no standard way to specify environment variables for PostgreSQL;至少,它不是Mac OSX上可行的解決方案。

回答

3

有一種方法可以做到這一點,事實證明。從版本1.6或更新版本開始,virtualenv附帶了一個腳本activate_this.py,可用於設置現有的解釋器來訪問特定的虛擬環境。

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不可用plpython os.environ - activate_this.py有fix checked in應滾動瓦特/下一個點釋放(這應該是1.11.7或1.12)

(從https://gist.github.com/dmckeone/69334e2d8b27f586414a截取大部分)

+0

我不確定這個virtualenv路徑在多個plpython調用中保持活動,因爲解釋器在每次調用時都是新的。我想你假設我們從最初的所有plpython方法調用workon()? – Sid 2014-12-04 13:56:20

+0

實際上,在一個會話(數據庫連接)中,所有的plpython函數共享一個解釋器,儘管它們獲得了全新的執行狀態(禁止全局GD數據共享字典) - 您不會爲每個查詢啓動一個新的解釋器。不要多次調用它,sys.path將繼續增長 – reedstrm 2015-01-22 18:28:21

2

通常我會說這不是一個好主意,但你可以按照this question

你可以做的是在不同的環境下運行PostgreSQL的多個實例以允許各種PYTHONPATH設置。