【问题标题】:Including and referencing 3rd party libraries in a GAE project在 GAE 项目中包含和引用第 3 方库
【发布时间】:2017-09-04 18:47:00
【问题描述】:

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

【问题讨论】:

    标签: python google-app-engine


    【解决方案1】:

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

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

    【讨论】:

    • 你会在一个 py 文件中还是在所有包含外部库的文件中这样做?
    • @Dan 通常,您会将其放在一个模块中,该模块可以在您希望能够导入外部库的任何地方(或者您知道将在这些库之前运行的地方,例如在您的脚本处理程序中)导入。
    【解决方案2】:

    如果外部缺少__init__.py 文件,您将无法执行from external import dateutil

    【讨论】:

    • 抱歉打错了。 init.py 也存在于外部。问题已解决。
    【解决方案3】:

    最好的方法是使用zipimport,你可以查看项目jaikuengine 他们有很多关于那个的好东西。

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

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

    这样,您无需修复库的路径。

    EDIT 加载所有压缩档案的示例 很大程度上受到 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))
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多