我创建了一个文件夹,其中包含我的 GAE 应用程序的所有模块以及 Jinja2 等外部库,以便将所有内容分类在一个地方。我有这样的文件夹结构:
lib\
\utils\
\__init__.py
\firepython
\jinja2
\jsonpickle
__init__.py
sessions.py
当我尝试从 utils__init__.py 加载 Jinja 时,出现错误 ImportError: No module named jinja2.environment
。当我查看 Jinja2 导入指令时,我发现它们看起来像 from jinja2.loaders
。我尝试将它们更改为类似于 from lib.jinja2.loaders
但随后会出现一些关于导入的其他错误。更重要的是,如果有更方便和正确的方法来正确导入模块,我认为在外部库源中更改这些导入不是一个好习惯。我还向 PYTHONPATH
添加了一些路径,但它并没有解决所有问题。如何正确导入放置在另一个文件夹中的外部包,可能具有深层结构?
最佳答案
事实上,您不必更改外部库中的导入 - 尽管根据您的环境,您甚至可能需要更改。
Python路径
修改您的 PYTHONPATH 就足够了; PYTHONPATH 应该包含一个“lib”路径,它可以是绝对路径,也可以是相对于您家的相对路径,例如。
那么你可以简单地做
from jinja2 import WHATEVER
sys.path.append
不用 PYTHONPATH 的另一种方法是使用 sys.path.append()
并从你的 python 代码中添加你的路径。我实际上赞成这样做,因为它还允许拥有每个应用程序的路径。
使用虚拟环境
详细信息放在这里会有点长,但请关注 official doc
这些选项适用于一般的 python 开发而不是 GAE 的特殊性;如果它在您的开发机器上不起作用,您应该发布更多详细信息(精确导入、绝对路径、pythonpath...)。
正确的项目结构和 appcfg.py 的使用应该在上传到 google 时解决依赖关系:请看看这个很好的答案:How do I manage third-party Python libraries with Google App Engine? (virtualenv? pip?)并遵循这些准则。
使用 GAE 的一个好方法是通过 yaml 应用程序指令。请查看包含的文档:http://code.google.com/appengine/docs/python/config/appconfig.html#Includes
还记得 GAE officially supports python 2.5 和 2.7 支持 is experimental 罢工>
Python 2.7 现在是 officially supported
关于python - Python 中的模块路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5646614/