我正在尝试将一些库导入我的程序(这是一个谷歌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
。
答案 0 :(得分:6)
我认为您实际上想要from pack1.mod2
而不是from lib.pack1.mod2
。
编辑并且,指定这个版本的Python会有所帮助,因为多年来输入语义逐渐得到改善!
编辑:啊哈!感谢您的评论;我现在明白了。您正在尝试重命名库而不进入它们并修复它们的名称现在不同的事实。问题是,不幸的是,你正在做的事情是不可能的。如果所有库都使用了相对导入,那么你可能有机会这样做;但是,唉,相对进口都是(a)最近和(b)没有广泛使用。
因此,如果您想使用库p
,那么您将不得不将其放在根目录中,而不是在lib/p
内,因为这会创建一个具有不同名称的库:{ {1}},这会给图书馆带来惊喜并打破它。
但我还有两个想法。
首先,如果您尝试这样做来组织文件,而不是因为您需要导入名称不同,那么(a)像您一样创建lib.p
但是(b)做不将lib
放入其中!而是将__init__.py
目录添加到lib
或程序内PYTHONPATH
。 (GAE是否允许您执行此类操作?是否有sys.path
?)
其次,当我说这是不可能的时候,我撒谎。严格地说,您可以通过向PYTHONPATH
添加一个条目来拦截所有模块查找,并尝试从sys.metapath
内部抓取它们(如果它们存在)。但是 - 哎呀。