2011-08-24 119 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是正交的问题。 –