2011-08-24 131 views
3

對於我的gae python項目,我想導入一個名爲'vobject'的外部庫。在我的.py文件中導入它的正確方法是什麼?在GAE項目中引入和引用第三方庫

該項目的自述說,爲了安裝它,你需要運行

python setup.py install 

此外,VOBJECT要求「dateutil」包。

因爲這將在GAE上運行,所以我認爲我應該將這兩個庫都複製到我的項目中,而不是運行安裝腳本以便在我的代碼中使用它。

但我收到一堆導入錯誤,我不確定外部gae/python庫的正確約定是什麼。

utc = dateutil.tz.tzutc() 
## error produced: 
File "myGaeProject/external/vobject/icalendar.py", line 47, in <module> 
NameError: name 'dateutil' is not defined 

的因爲我構建我的項目的方式,我改變了icalendar.py的進口結構從:

import dateutil.rrule 
import dateutil.tz 

到:

import external.dateutil.rrule 
import external.dateutil.tz 

我也試過:

from external.dateutil import * 

什麼是正確的進口機anism結構性像這樣一個項目:

-myGaeProject 

--external 
----__init__.py  

----dateutil 
------__init__.py 
------tz.py 
------rrule.py 
------[more dateutil files] 

----vobject 
------__init__.py 
------base.py  
------icalendar.py  

--handlers 
------__init__.py 
------mainHandler.py 

回答

3

不要修改庫。如果你想要把所有的圖書館external,你需要添加external到你的Python路徑試圖從那裏導入庫之前:

import os 
import sys 
sys.path.append(os.path.join(os.path.dirname(__file__), 'external')) 
import some_external_library 
+0

你會在只有一個py文件或包含外部庫的所有文件中執行此操作嗎? –

+0

@Dan通常你會把它放在一個你想導入外部庫的地方(或者你知道會在這些庫之前運行的地方,比如你的腳本處理程序中)導入的模塊中。 –

1

你不能這麼做from external import dateutil如果外部缺少一個__init__.py文件。

+0

對不起,這是一個錯字。 __init__.py也存在於外部。問題修復。 –

0

好的方法是使用zipimport,你可以檢查項目jaikuengine他們是很多好東西。

http://code.google.com/p/jaikuengine/source/browse/trunk/build.py

在的Jaiku,所有外部庫被放養在目錄vendor,但如果你看到app.yaml中,在vendor所有文件被跳過。 Jaiku使用腳本在供應商中構建每個庫的zip,並在部署之前或啓動dev_server時將其放到項目的根目錄中。

因此,你不需要修復你的庫的路徑。

編輯一個例子來加載所有壓縮檔案 從jaikuengine很大程度上啓發:

def load_zipped(path='.'): 
    for x in os.listdir(path): 
    if x.endswith('.zip'): 
     if not any([y.endswith(x) for y in sys.path]): 
     sys.path.append(os.path.abspath('%s/%s') % (path, x)) 
+0

您不必使用zipimport。 –

+0

是的,使用zipimport是不明確的:http://docs.python.org/library/zipimport.html#examples – sahid

+0

不,我的意思是使用zipimport是正交的問題。 –