我已经基于默认模板创建了一个简单的GAE应用程序。我想添加一个像short_url这样的外部模块。我该怎么做呢?到目前为止,我发现的方向令人困惑,GAE似乎并没有使用PYTHONPATH,原因很明显。
答案 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目录并按原样使用,只要它们不尝试在沙箱之外工作,即无法创建文件,无法打开网络套接字等
还要牢记硬限制:
更新(2011年10月):这些数字中的大部分have been increased为:
更新(2012年6月):最后一个限制was bumped up:
答案 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模块一样导入它。