如何在Google App Engine中导入模块?

时间:2010-04-26 02:45:50

标签: python google-app-engine

我已经基于默认模板创建了一个简单的GAE应用程序。我想添加一个像short_url这样的外部模块。我该怎么做呢?到目前为止,我发现的方向令人困惑,GAE似乎并没有使用PYTHONPATH,原因很明显。

4 个答案:

答案 0 :(得分:30)

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

示例App Engine项目:

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()

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

import fix_path

...列在main.py文件中的所有其他导入之前 如果我的解释不明确,这是一个link to full, working example

答案 1 :(得分:5)

我会回答@Adam Bernier和@ S.Mark给出的答案,尽管adam解释的事情更详细一些。通常,您可以将任何纯Python模块/包添加到您的App Engine目录并按原样使用,只要它们不尝试在沙箱之外工作,即无法创建文件,无法打开网络套接字等

还要牢记硬限制:

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

更新(2011年10月):这些数字中的大部分have been increased为:

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

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

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

答案 2 :(得分:1)

您可以将ZIP包导入为ZIP。这样可以避免最大文件数。

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.zip 解压缩到“boto”子目录中,其中包含“boto”模块(作为另一个子目录)。

所以要自然地导入boto你可能需要从boto import boto做,但这可能会因缺少__init __而引起的怪异.py。

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

答案 3 :(得分:0)

由于用python编写的url_shortener程序,你可以只在你的源代码中包含它并像其他python模块一样导入它。