如何从Python Google App Engine中的模块访问出售的库?

时间:2016-01-24 06:55:47

标签: python google-app-engine

当我尝试访问应用程序根目录中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是在主应用程序级别而不是模块级别定义的。在每个模块中复制相同的文件和sym链接是否正确。

2 个答案:

答案 0 :(得分:0)

为什么要在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真的是模块/包吗?

答案 1 :(得分:0)

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

所以将lib目录和应用程序目录中的appengine_config.py符号链接到模块的目录中。另外,对于我的应用程序,正如蒂姆所提到的,有效的销售线确实只是vendor.add('lib')。复制它们同样适用,但是符号链接更好,因为您只需要在版本控制系统中保持一个副本,即DRY精神。 appcfg.py脚本知道遵循符号链接并上传符号链接指向的实际文件。

如果你不需要所有但只需要模块中某些的库,你可以在该模块目录中创建一个lib目录,并且只能创建一个符号链接应用程序lib目录的必要子目录到相应模块的lib目录中(不上传不必要的文件)。

可能还需要将其他应用级配置文件符号链接到某些模块目录中,以便在开发服务器上保留一些支持脚本,请参阅以下答案:https://stackoverflow.com/a/34111170/4495081 。请注意,更新应用级配置可能不会简单地通过上传单模块应用教程中提到的模块代码来实现,它们需要使用appcfg.py的相应参数显式请求,如上所述答案中的备忘单。