在GAE项目中包含和引用第三方库
在我的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