Python 如何在模块内导入lib文件夹

Python 如何在模块内导入lib文件夹,python,google-app-engine,python-2.7,Python,Google App Engine,Python 2.7,我有一个GAE应用程序,它包含三个模块和一个lib文件夹。当我试图从lib文件夹导入第三方库时。盖伊发出一声恐怖的声音 我可以通过将./lib符号链接到./Module_1/lib和./Module_2/lib并在每个模块中创建一个appengine_config.py来让它工作。但这样做似乎真的很肮脏。 是否有更干净的方法从模块1和模块2导入app_root/lib 这似乎很有希望(),但不知道在include.yaml中放什么 -- App Root/ -- Module_1/

我有一个GAE应用程序,它包含三个模块和一个lib文件夹。当我试图从lib文件夹导入第三方库时。盖伊发出一声恐怖的声音

我可以通过将./lib符号链接到./Module_1/lib和./Module_2/lib并在每个模块中创建一个appengine_config.py来让它工作。但这样做似乎真的很肮脏。
是否有更干净的方法从模块1和模块2导入app_root/lib

这似乎很有希望(),但不知道在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
在模块_1.py或模块_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', 
  ...
  ...
 ]  
模块_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', 
   ...
   ...
  ]

归功于谷歌云平台技术解决方案代表Adam:

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

他建议不要制作符号链接,而是将./lib复制到每个模块中

我不太喜欢这个主意

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

其次,在任何地方复制lib文件夹都会破坏单元测试,因为nose将尝试运行它可以运行的所有单元测试,这也是因为显式排除目录是一件痛苦的事情

最后,我编写了一个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

GAE上将只上载包含*.yaml文件的文件夹,因此您的
lib
文件夹应位于模块内部。制作一个符号链接。