【问题标题】:How do I access a vendored library from a module in Python Google App Engine?如何从 Python Google App Engine 中的模块访问供应商库?
【发布时间】:2016-04-30 14:36:44
【问题描述】:

当我尝试访问应用程序根目录中 lib 目录中的库时,我收到 ImportError。

我在documentation 中完成了必要的步骤,它只适用于一个模块,但一旦我移动到这个包含多个模块的目录结构,它就不再适用了:

<app root>
  |
  +-- appengine_config.py
  |
  +-- lib
  |
  +-- modules     
      +-- module1
      |
      +-- module2

在我的 appengine_config.py 中添加以下行:vendor.add(os.path.join(os.path.dirname(__file__), 'lib'))

对这里可能发生的事情有什么想法吗?

编辑: 这个目录结构似乎对我有用:

<app root>
  |
  +-- lib
  |     
  +-- module1
  |     +-- appengine_config.py
  |     |
  |     +-- app.yaml
  |     |
  |     +-- lib <symlink to app root lib>
  +-- module2 (same as module 1)

我认为 appengine_config.py 是在主应用程序级别而不是模块级别定义的东西。在每个模块中复制相同的文件和符号链接是否正确。

【问题讨论】:

  • 您的模块的.yaml 文件在哪里?我的意思是您是否遵循文档中的第一个或第二个应用程序结构建议:cloud.google.com/appengine/docs/python/modules/…
  • queue.yamlcron.yaml 等顶级 yaml 文件位于应用根目录中,而 app.yaml 文件位于 modules/module1modules/module2 目录中。我主要遵循第一个应用程序结构,但将所有模块嵌套在模块目录中。很抱歉命名混乱,因为它可能会与您的标准 Python 模块混淆。

标签: python google-app-engine


【解决方案1】:

为什么要在 vendor.add 中包含 os.path.dirname(file) ?

查看文档。 https://cloud.google.com/appengine/docs/python/tools/libraries27?hl=en#vendoring

vendor.add('lib') 或者最坏的情况 vendor.add('lib/modules') 就是你所需要的。

modules 真的是一个模块/包吗?

【讨论】:

  • 我最初有vendor.add('lib'),但它也不起作用,所以我只是尝试了docs中提到的技巧。 modules 是我保存所有模块的目录。想将我所有不同的模块组织在一个地方。
  • 我也刚刚尝试将我的所有应用程序引擎模块从模块目录内向下移动到应用程序根目录内。我正在使用dev_appserver.py btw 进行测试。
  • appengine_config.py 在应用程序根目录中时,它实际上似乎根本没有运行。当我将它移到 module1 内部并在 module1 中创建一个符号链接以指向主 lib 目录时,它似乎实际上运行了该文件。编辑了我原来的问题,似乎有帮助。
【解决方案2】:

每个模块目录都作为独立应用程序上传,并且它需要该模块目录中的所有文件(即模块的 目录中的任何内容都不会上传/在模块中可见)。模块目录是包含模块的.yaml 文件的目录,因此在您的情况下,它们将是modules/module1modules/module2 目录。

因此,将应用程序目录中的lib 目录和appengine_config.py 符号链接到模块的目录中。此外,对于我的应用程序,正如 Tim 所提到的,有效的 vendoring 行确实只是 vendor.add('lib')。复制它们同样有效,但符号链接更好,因为您只需要本着 DRY 精神在版本控制系统中维护一份副本。 appcfg.py 脚本知道跟随符号链接并上传符号链接指向的实际文件。

如果您不需要 all 而只需要模块中的 一些 库,则可以在该模块目录中创建 lib 目录,并且只对必要的库进行符号链接将应用程序的lib 目录的子目录放入相应模块的lib 目录(以不上传不必要的文件)。

可能还需要符号链接到一些模块目录其他应用程序级配置文件,以保持开发服务器上的一些支持脚本满意,请参阅此答案:https://stackoverflow.com/a/34111170/4495081。请注意,更新应用程序级别的配置可能不会像单模块应用程序教程中提到的那样简单地通过上传模块的代码来发生,它们需要使用appcfg.py 的相应参数显式请求,如作弊中所述该答案中的表格。

【讨论】:

  • 非常感谢大家。很好的解释!
猜你喜欢
  • 1970-01-01
  • 2017-02-18
  • 2013-06-12
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 2014-12-16
  • 2015-11-05
  • 2011-12-12
相关资源
最近更新 更多