对于我的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
答案 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))