python - 在 Python 中导入嵌套模块

标签 python import module

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

通过使用 import lib.modulefrom lib import module 可以正常导入,但是当我尝试导入一个完整的包时会发生什么,例如一个名为 pack1 的文件夹,其中包含各种模块,通过调用 from lib.pack1 import *,我在静态访问另一个模块的模块之一中遇到此错误,即 from pack1.mod2导入某事
克服这个问题的简单而干净的方法是什么?无需修改库本身。

编辑:使用 Python 2.7。
编辑:错误:当使用import lib.pack1时,我得到ImportError: No module named pack1.mod1

最佳答案

我认为您实际上想说的不是 from pack1.mod2 而是 from lib.pack1.mod2

编辑:并且指定这是什么版本的 Python 会有所帮助,因为这些年来导入语义逐渐改进!

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

所以,如果你想使用库 p,那么你必须将它放在你的根目录中,而不是 lib/p 中,因为那样会创建具有不同名称的库:lib.p,这将使库大吃一惊并破坏它。

但我还有两个想法。

首先,如果您尝试这样做是为了组织您的文件,而不是因为您需要不同的导入名称,那么 (a) 像您正在做的那样创建 lib 但是 (b) 不要在里面放一个__init__.py!相反,将 lib 目录添加到您的 PYTHONPATH,或者在您的程序内部添加到 sys.path。 (GAE 让你做这样的事情吗?它有 PYTHONPATH 吗?)

其次,当我说这不可能时,我是在撒谎。严格来说,您可以通过向 sys.metapath 添加一个条目来做到这一点,该条目拦截所有模块查找并尝试从 lib 内部获取它们(如果它们存在于那里)。但是——糟糕。

关于python - 在 Python 中导入嵌套模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3929228/

相关文章:

python - 如何检查数组中的值是否以特定字母开头?

python - 在 Python/Pandas 中连接/合并数据框和编辑列名

java - 导入包.* 与导入包.SpecificType

javascript - 使用 eval 模拟私有(private)范围标识符

javascript - Webpack 使用 Emscripten 抛出错误 : Can't resolve 'fs'

python - 在Python中迭代嵌套列表

Python 循环内的递归调用。它是如何工作的?

python 尝试,除了来自未显式导入的模块的错误

python - 将自定义模块导入 jupyter notebook

linux - 如何在不重命名传递给 insmod 的 .ko 的情况下重命名内核模块名称?