【问题标题】:How to import lib folder within Modules如何在模块中导入 lib 文件夹
【发布时间】:2015-02-02 04:27:01
【问题描述】:

我有一个 GAE 应用程序,其中包含三个模块和一个 lib 文件夹。当我尝试从 lib 文件夹中导入第 3 方库时。 GAE 弹出 ImportError。

我可以通过将 ./lib 符号链接到 ./Module_1/lib 和 ./Module_2/lib 并在每个模块中创建 appengine_config.py 来使其工作。但是这样做似乎很肮脏。
有没有更简洁的方法从 module_1 和 module_2 导入 app_root/lib?

这似乎很有希望(https://cloud.google.com/appengine/docs/python/config/appconfig#Python_app_yaml_Includes),但不知道在 include.yaml 中放什么。

-- App Root/
    -- Module_1/
       module_1.yaml 
       module_1.py

    -- Module_2/
       module_2.yaml
       module_2.py

    -- lib/ 
       -- cloudstorage/
          ..
       -- 3rd_library_1/
          ..
          ..
       -- 3rd_library_2/
          ..
          ..

    appengine_config.py
    main.py (default module)
    app.yaml(default module)
    queue.yaml
    dispatch.yaml

在module_1.py或module_2.py中,当我这样做时

    import cloudstorage as gcs

它抱怨

    ImportError: No module named cloudstorage

但是,当它在 main.py 中导入时,它可以正常工作。

在 appengine_config.py 中:

import os
import sys

# Add ./lib to sys path
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'lib'))

还尝试从 main.py 打印 sys.path:

sys.path in main.py :
[ 
  '/base/data/home/apps/s~my-app/2.381942946570489905', 
  '/base/data/home/apps/s~my-app/2.381942946570489905/lib', 
  ...
  ...
 ]  

module_1.py 中的sys.path:

 [
  '/base/data/home/apps/s~my-app/module_1:2.381942955973772449',      
  '/base/data/home/runtimes/python27/python27_dist/lib/python27.zip', 
   ...
   ...
  ]

【问题讨论】:

  • 只有包含 *.yaml 文件的文件夹才会被上传到 GAE,所以你的 lib 文件夹应该在你的模块里面。做一个符号链接。

标签: python google-app-engine python-2.7


【解决方案1】:

感谢 Google Cloud Platform 技术解决方案代表 Adam:

模块文档可能不明确 声明,但文件夹 'Module1'、'Module2' 以及默认 模块实际上在单独的 Python 虚拟环境中运行 单独的实例,需要自包含。他们无法“看到” 存在于本地文件系统上的任何目录,以及 “default.py”在每个模块目录中都看不到任何内容。这 整个文件夹树不会复制到每个模块实例。

他建议不要制作符号链接,只需将 ./lib 复制到每个模块即可。

我不太喜欢这个主意。

首先,这些模块共享一些基类,复制它们确实是一种反模式。

其次,到处复制 lib 文件夹会破坏单元测试,因为鼻子会尝试运行它可以运行的所有单元测试,也因为显式排除目录很痛苦。

最后,我写了一个 makefile 来帮助部署/测试更容易...

# Create simlinks before deployment.
deploy: mksimlnks
    appcfg.py --oauth2 update $(CURDIR)/app.yaml
    appcfg.py --oauth2 update $(CURDIR)/MODULE_1/module_1.yaml
    appcfg.py --oauth2 update $(CURDIR)/MODULE_2/module_2.yaml
    appcfg.py --oauth2 update_queues $(CURDIR)

mksimlnks:
    ln -s $(CURDIR)/lib $(CURDIR)/MODULE_1/lib
    ln -s $(CURDIR)/lib $(CURDIR)/MODULE_2/lib

# Need to remove symlinks before unittest
# or unit test will explode.
test: rmsimlnks
    nosetests --exclude-dir=lib --with-gae -w $(CURDIR) --with-coverage --cover-html

# Remove all symlinks
rmsimlnks:
    rm -rf $(shell find * -type l)

# remove symlinks and other stuff
clean: rmsimlnks
    rm -f $(shell find * -name *.pyc)
    rm -f $(shell find * -name .DS_Store)
    rm -f .coverage
    rm -rf $(CURDIR)/cover

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多