注意:这是 Python 3.5
给定一些项目 thing
这样:
thing/
top.py (imports bar)
utils/
__init__.py (empty)
bar.py (imports foo; has some functions and variables)
foo.py (has some functions and variables)
我可以在 top.py 中导入 utils.bar
,并且在运行 top.py 时文件 bar.py 必须包含 import utils.foo
以获取 foo.py 的代码。
要直接运行 bar.py,bar.py 必须有 import foo
代替(import utils.foo
失败)。如果我进行了更改,则 top.py 将不再有效。
我如何运行 top.py 或 bar.py 并在 bar.py 中为这两种用例使用相同的导入结构?我觉得我缺少一些简单的步骤或结构,但也许期望 bar.py 以这种方式独立工作要求太多(缺少条件导入等)。
编辑:我已经接受了正确的答案,但如果你仍然坚持做一些扭曲,以下对我有用:
在bar.py
try:
import foo
except ImportError as err:
from . import foo
然后您可以直接运行 bar.py(在我的例子中,当我开发 bar.py 时,我在 if __main__
block 中使用了一些实验代码文件底部)。一旦我的代码很好地集成,我将删除条件和 main 部分(因为它不打算独立运行)。
最佳答案
通常将所有入口点都放在模块之外,而不是所有导入都是相对的。 例如
thing/
app.py
thing/
__init__.py
top.py
utils/
__init__.py
bar.py
foo.py
app.py 可以看起来像
from thing import app
if __name__ == '__main__':
app.main()
比在 top.py 中你有
from .utils import bar
在酒吧你有
from . import foo
或者
from thing.utils import foo
或者
from ..utils import foo
因此,如果您需要两个入口点,您可以让 app
为第二个入口点获取命令行参数,或者您可以创建另一个文件,例如导入 bar 的 app
关于python - 在 Python 中导入模块作为包的一部分*以及*以独立工作的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40456206/