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

我已经创build了一个基于默认模板的简单的GAE应用程序。 我想添加一个像short_url这样的外部模块。 我如何做到这一点? 到目前为止,我发现的方向是令人困惑的,GAE似乎没有使用PYTHONPATH,我想这是显而易见的原因。

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

示例App Engine项目:

 MYAPP /
    的app.yaml
     index.yaml中
     main.py
     short_url.py
     views.py

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

 import short_url 

对于更复杂的项目,或许更好的方法是创build一个专门用于依赖关系的目录; 说lib

 MYAPP /
     LIB /
         __init__.py
         short_url.py
    的app.yaml
     index.yaml中
     main.py
     views.py
 from lib import short_url 

编辑#2:
道歉,我应该早些提到这一点。 你需要修改你的path,感谢尼克·约翰逊以下修复。
确保在启动应用程序之前运行此代码; 像这样的东西:

 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:
为了让代码在所有其他导入之前运行,可以将pathpipe理代码放入应用程序的基本目录(Python可识别该目录中的所有内容,而不进行任何path修改)。
然后你只要确保这个导入

 import fix_path 

…在main.py文件中的所有其他导入之前列出。
如果我的解释不清楚,这里有一个链接到完整的工作示例 。

我会第二个@Adam Bernier和@ S.Mark给出的答案,虽然adam的解释是更详细一点。 一般来说,只要不尝试在沙箱外工作,即不能创build文件,无法打开networking套接字等,您可以将任何纯Python模块/软件包添加到您的App Engine目录并按原样使用。 。

也要牢记硬性限制:

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

更新(2011年10月):这些数字大部分已经增加到 :

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

更新(2012年6月):最后的限制碰到 :

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

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

应用引擎文档解决了这个问题。

python2.5:zipimport支持。

python 2.7:不支持zipimport,但Python 2.7可以从.zip文件本地导入。

这是我如何import博托。

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

这种技术的缺点包括不得不手动重新归档许多软件包。

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

所以要导入boto自然你可能不得不从botoimportboto,但是这会导致缺乏__init__.py的怪异。

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

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