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

3 投票
3 回答
1166 浏览
提问于 2025-04-17 00:14

在我的GAE Python项目中,我想要导入一个叫做'vobject'的外部库。请问在我的.py文件中,正确的导入方式是什么?

项目的说明文件里说,要安装这个库,你需要运行

  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 *

那么,对于这样结构的项目,正确的导入机制是什么呢:

-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

一个好的方法是使用zipimport,你可以看看jaikuengine这个项目,里面有很多不错的东西。

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

在Jaiku中,所有的外部库都放在一个叫vendor的文件夹里,但如果你查看app.yaml文件,会发现vendor里的所有文件都被跳过了。Jaiku使用一个脚本来把vendor里的每个库打包成一个zip文件,并在项目的根目录放置这个zip文件,通常是在部署之前或者当开发服务器启动时。

这样一来,你就不需要去修正库的路径了。

编辑:这是一个加载所有压缩包的例子,灵感主要来自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))
1

如果外部文件夹里没有一个叫做 __init__.py 的文件,你就不能用 from external import dateutil 这样的方式来导入它。

3

不要去修改库文件。如果你想把所有的库放在 external 这个文件夹里,你需要在尝试从那里导入库之前,把 external 加入到你的 Python 路径中:

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

撰写回答