我有一个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',
...
...
]
模块_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',
...
...
]
感谢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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句