【问题标题】:Access to module denied from within GAE dev server从 GAE 开发服务器中访问模块被拒绝
【发布时间】:2011-02-14 22:53:57
【问题描述】:

我正在为 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 还很陌生 - 我缺少什么?

【问题讨论】:

  • 顺便说一句,当我运行 python 命令行并尝试“import feedparser”时,它可以正常工作
  • 听起来像是权限错误,dev_appserver.py 运行时假设的用户是什么?

标签: python django google-app-engine permissions


【解决方案1】:

App Engine 在沙盒中运行 Python 代码,并且只有经过授权的标准库模块和包才能从您的应用程序中导入。

正如@mg 所提到的,如果您想允许第三方模块和包,您需要将它们与您的应用程序捆绑在一起。要专门针对 feedparser 执行此操作,只需将 feedparser.py 文件放入您的顶级 App Engine 目录(您的 app.yamlindex.yamlmain.py 所在的位置)。

(2011 年 10 月更新)还请牢记硬性限制:

  • 最大文件总数(应用程序文件和静态文件):3,000(2011 年 10 月在 1.5.5 中增加到 10k)
  • 应用程序或静态文件的最大大小: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 模块:

http://code.google.com/appengine/kb/libraries.html

【讨论】:

    【解决方案2】:

    因为在 GAE 中,您无法访问不属于 GAE 本身、不包含在 GAE 中(如 django 0.96.1)或不属于您的应用程序的库。将该库以及其他所有库安装在 Web 应用程序的同一路径中。

    编辑

    来自documentation

    您可以包含其他纯 Python 与您的应用程序的库 将代码放入您的应用程序中 目录。如果你做一个符号链接 到你的模块目录 应用程序目录,appcfg.py 将 点击链接并包含模块 在您的应用中。

    Python 模块包含路径 包括您的应用程序的根 目录(目录包含 app.yaml 文件)。您创建的模块 在应用程序的根目录中 可以使用从 根。不要忘记创建 init.py 文件在子目录中,因此 Python 将识别 子目录作为包。

    【讨论】:

      猜你喜欢
      • 2021-03-22
      • 2018-05-01
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      相关资源
      最近更新 更多