代码之家  ›  专栏  ›  技术社区  ›  Brian Lyttle

如何在谷歌应用引擎中导入模块?

  •  22
  • Brian Lyttle  · 技术社区  · 15 年前

    我已经基于默认模板创建了一个简单的GAE应用程序。我想添加一个外部模块 short_url . 我该怎么做?到目前为止,我发现的方向很混乱,而且盖伊似乎没有使用蟒蛇,因为我猜很明显的原因。

    4 回复  |  直到 11 年前
        1
  •  30
  •   mechanical_meat nazca    15 年前

    只需将 short_url.py 文件在应用程序的目录中。

    示例应用程序引擎项目:

    myapp/
        app.yaml
        index.yaml
        main.py
        short_url.py
        views.py
    

    而在 views.py (或在任何地方),然后您可以这样导入:

    import short_url
    

    对于更复杂的项目,也许更好的方法是创建一个目录,特别是为依赖项创建;比如 lib :

    myapp/
        lib/
            __init__.py
            short_url.py
        app.yaml
        index.yaml
        main.py
        views.py
    
    from lib import short_url
    

    编辑第2页:
    抱歉,我应该早点提到这个。您需要修改您的路径,感谢Nick Johnson提供以下修复。
    确保在启动应用程序之前运行此代码;如下所示:

    import os
    import sys
    
    def fix_path():
        # credit:  Nick Johnson of Google
        sys.path.append(os.path.join(os.path.dirname(__file__), 'lib'))
    
    def main():
        url_map = [ ('/', views.IndexHandler),] # etc.
        app = webapp.WSGIApplication(url_map, debug=False)
        wsgiref.handlers.CGIHandler().run(app)
    
    if __name__ == "__main__":
        fix_path()
        main()
    

    EdTe3:
    要在所有其他导入之前运行此代码,可以将路径管理代码放在应用程序的基目录中自己的一个文件中(python可以识别该目录中的所有内容,而不进行任何路径修改)。
    然后你就可以确保

    import fix_path
    

    …列在您的 main.py 文件。
    这里有一个 link to full, working example 以防我的解释不清楚。

        2
  •  5
  •   wescpy    12 年前

    我将根据@adam bernier和@s.mark给出的答案进行排序,尽管adam的解释更加详细。通常,您可以将任何纯python模块/包添加到应用程序引擎目录中,并按原样使用,只要它们不尝试在沙盒之外工作,即无法创建文件、无法打开网络套接字等。

    还要记住硬限制:

    • 最大文件总数(应用程序文件和静态文件):3000
    • 应用程序文件的最大大小:10兆字节
    • 静态文件的最大大小:10兆字节
    • 所有应用程序和静态文件的最大总大小:150兆字节

    更新(2011年10月):大部分数字 have been increased 到:

    • 最大文件总数(应用程序文件和静态文件):10000
    • 应用程序文件的最大大小:32MB
    • 静态文件的最大大小:32MB

    更新(2012年6月):最后一个限制 was bumped up 到:

    • 所有应用程序和静态文件的最大总大小:1GB
        3
  •  1
  •   Josh    11 年前

    您可以将python包作为压缩包导入。这样可以避免最大文件数。

    这个 app engine docs 解决这个问题。

    python 2.5:支持zipimport。

    python 2.7:不支持zipimport,但python 2.7可以 natively import from .zip files.

    这就是我导入boto的方式。

    sys.path.insert(0, 'boto.zip')
    import boto #pylint: disable=F0401
    from boto import connect_fps  #pylint: disable=F0401
    

    这种技术的缺点包括必须手动重新归档许多包。

    例如, 拉链 解压缩到“boto”子目录中,其中包含“boto”模块(作为另一个子目录)。

    因此,要自然地导入boto,您可能需要从boto导入boto,但这可能会导致缺少uu init_uuuy.py的奇怪。

    要解决此问题,只需解压缩并存档 博托 将子文件夹手动设置为boto.zip,并将其放到应用程序文件夹中。

        4
  •  0
  •   YOU    15 年前

    由于该URL缩短程序是用python编写的,所以您可以将其包含在源代码中,并像其他python模块一样导入它。