在GAE项目中包含和引用第三方库

时间:2011-08-24 01:43:47

标签: python google-app-engine

对于我的gae python项目,我想导入一个名为'vobject'的外部库。在我的.py文件中导入它的正确方法是什么?

该项目的自述文件说,为了安装它,你需要运行

  python setup.py install

此外,vobject需要'dateutil'包。

由于这将在GAE上运行,我认为我应该将两个lib复制到我的项目中,而不是运行安装脚本以在我的代码中使用它。

但是我收到了一堆导入错误,我不确定外部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 *

如此结构的项目的正确导入机制是什么:

-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 个答案:

答案 0 :(得分:3)

不要修改库。如果要将所有库放在external中,则需要在尝试从那里导入库之前将external添加到python路径:

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

答案 1 :(得分:1)

如果外部缺少from external import dateutil文件,则无法__init__.py

答案 2 :(得分:0)

好的方法是使用zipimport,你可以检查项目jaikuengine他们是很多好事。

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

在Jaiku中,所有外部库都存放在目录vendor中,但如果您看到app.yaml,则会跳过vendor中的所有文件。 Jaiku使用脚本为供应商中的每个库构建一个zip,并在部署之前或启动dev_server时将其放到项目的根目录中。

这样,您就不需要修复libs的路径了。

编辑加载所有压缩档案的示例 受到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))