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

2024-05-19 17:38:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

  python setup.py install

另外,vobject需要“dateutil”包。在

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

但是我遇到了一堆导入错误,我不确定外部gae/python库的正确约定是什么。在

^{pr2}$

因为我组织项目的方式,我改变了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

Tags: install文件项目pyimportinitmy结构
3条回答

好的方法是使用zipimport,你可以查一下jaikuengine的项目,他们有很多关于这个的好东西。在

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

在Jaiku中,所有外部lib都存储在目录vendor中,但是如果您看到应用程序yaml,将跳过vendor中的所有文件。 Jaiku使用一个脚本来构建供应商中每个libs的zip,并在部署之前或dev_服务器启动时将其放到项目的根目录中。在

这样,你就不需要修复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))

如果external缺少__init__.py文件,则无法执行from external import dateutil。在

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

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

相关问题 更多 >