在Python中导入嵌套模块

rez*_*zzy 1 python import module

我正在尝试将一些库导入我的程序(这是一个谷歌AppEngine应用程序).基本上,我应该将所有库放在根文件夹中,但我刚刚创建了另一个名为lib的文件夹并将它们放在该文件夹中.(我创造了__init__.py)

通过使用import lib.module或者导入定期工作正常from lib import module,但是当我尝试导入一个完整的包时,例如一个名为pack1的文件夹,其中包含各种模块,通过调用from lib.pack1 import *,我在其中一个访问过的模块中出现此错误静态的另一个模块,即from pack1.mod2 import sth.
克服这个问题的简单而干净的方法是什么?无需修改库本身.

编辑:使用Python 2.7.
编辑:错误:使用时import lib.pack1,我明白了ImportError: No module named pack1.mod1.

Bra*_*des 6

我想,而不是from pack1.mod2你真的想说from lib.pack1.mod2.

编辑:并且,指定这个版本的Python会有所帮助,因为多年来输入语义逐渐得到改善!

编辑:啊哈!感谢您的评论; 我现在明白了.您正在尝试重命名库而不进入它们并修复它们的名称现在不同的事实.问题是,不幸的是,你正在做的事情是不可能的.如果所有库都使用了相对导入,那么你可能有机会这样做; 但是,唉,相对进口是(a)最近和(b)没有广泛使用.

所以,如果你想使用库p,那么你将不得不把它放在你的根目录中,而不是lib/p因为它创建了一个具有不同名称的库:lib.p这将使库感到非常惊讶并打破它.

但我还有两个想法.

首先,如果你想这样做是为了组织文件,而不是因为你需要进口的名字是不同的,那么(一)建立lib像你做什么,但(b)完全把一个__init__.py里面!而是将lib目录添加到您PYTHONPATH或您的程序内部sys.path.(GAE是否允许你做这样的事情?它有PYTHONPATH吗?)

第二,当我说这是不可能的时候,我撒谎.严格地说,你可以通过添加一个条目来sys.metapath拦截所有模块查找,并尝试从内部抓取它们(lib如果它们存在).但是 - 哎呀.