在GAE开发服务器中访问模块被拒绝
我正在为GAE开发一个应用。
我通过setuptools安装了“feedparser”这个模块,然后尝试用“import feedparser”来导入它。但是,这个模块没有加载,当我查看屏幕上的dev_appserver.py调试日志时,看到以下内容:
Access to module file denied: /usr/local/lib/python2.6/dist-packages/feedparser-4.1-py2.6.egg/feedparser.py
所以GAE开发服务器无法访问这个模块,但我不知道为什么。路径是正确的,文件也可以访问。
我对Python/Django/GAE还比较陌生,我可能漏掉了什么?
2 个回答
在GAE(谷歌应用引擎)中,你不能使用那些不属于GAE本身的库,比如django 0.96.1,或者没有包含在GAE里的库。你需要把这些库安装在你的网络应用的同一个路径下。
编辑
根据文档:
你可以通过把其他纯Python库的代码放在你的应用目录中来包含这些库。如果你在应用目录中对某个模块的目录创建一个符号链接,appcfg.py会跟随这个链接,把模块包含到你的应用里。
Python模块的包含路径会包括你应用的根目录(也就是包含app.yaml文件的目录)。你在应用根目录中创建的模块可以通过从根目录开始的路径来使用。别忘了在子目录中创建init.py文件,这样Python才能把这些子目录识别为包。
App Engine 在一个受限制的环境中运行 Python 代码,只有经过授权的标准库模块和包可以从你的应用中导入。
正如 @mg 提到的,如果你想使用第三方模块和包,你需要把它们打包到你的应用里。具体来说,如果你想使用 feedparser,只需将 feedparser.py
文件放到你的 App Engine 顶层目录中(也就是你的 app.yaml
、index.yaml
和 main.py
文件所在的地方)。
(更新于2011年10月)还要记住一些硬性限制:
- 文件总数的最大限制(应用文件和静态文件):3000个(在2011年10月的1.5.5版本中提升到10000个)
- 应用或静态文件的最大大小:10MB(在1.5.5版本中提升到32MB)
- 所有应用和静态文件的总大小最大限制:150MB
如果你想减少文件的总数,可以把多个 .py
文件放在一个 ZIP 压缩包里,这样你只需要算一个文件的大小。虽然这篇文章有点过时——推荐打包 Django 1.0,而现在已经包含在内——但将模块和包打包成 ZIP 文件的这个方法仍然适用:
http://code.google.com/appengine/articles/django10_zipimport.html
官方文档中讨论文件限制的页面:
http://code.google.com/appengine/docs/python/runtime.html#Pure_Python
(更新于2011年11月):下面的链接列出了 Python 2.5 中的白名单模块/包和 C 代码。Python 2.7 的运行环境放宽了许多限制,以至于白名单变成了黑名单。这里是允许的/白名单的 2.5 C 模块以及不允许的/黑名单的 2.7 C 模块: