最小示例 Python 模块导入的问题

Posted

技术标签:

【中文标题】最小示例 Python 模块导入的问题【英文标题】:Trouble with minimal example Python Module Imports 【发布时间】:2021-11-13 17:30:28 【问题描述】:

我制作了一个最小的示例项目来尝试解决我的模块导入问题。结构如下:

MyProject/
├── main.py
└── utils/
    ├── __init__.py
    ├── foo.py
    └── bar.py

ma​​in.py 仅包含此代码:from utils import foo

__init__.py 不包含任何代码

foo.py 仅包含此代码:from bar import Bar

bar.py 仅包含此代码:class Bar: pass

如果我运行python utils/bar.py,它将毫无例外地运行。

同样,如果我运行python utils/foo.py,它会毫无例外地运行。

但是,如果我运行python main.py,则会导致以下异常:ModuleNotFoundError: No module named 'bar'

有没有办法解决这个问题?或者它甚至是一个问题,也许我正在做一些我不应该做的事情?

【问题讨论】:

from .bar import Bar ? 这修复了运行 main.py 的能力,但是如果我尝试运行 foo.py,我会收到一个新错误:“ImportError:尝试使用没有已知父包的相对导入” ``` try: from .bar import Bar except ImportError: # python3 from bar import Bar except ValueError: # python2 from bar import Bar ``` 成功了!谢谢!不过很有趣……这是这类事情的标准做法吗? 调用“子包”和“主包”也不是真正的标准做法。除了通过调整 main.py 中的 python 模块搜索路径之外,可能还有其他更简洁的方法可以避免这些,例如:***.com/questions/16981921/… 【参考方案1】:

如果您想将其用作独立调用 (python utils/foo.py) 和来自主调用 (python main.py),您可以同时使用两个导入:

try:
    from .bar import Bar
except ImportError: # for python3
    from bar import Bar
except ValueError: # for python2
    from bar import Bar

【讨论】:

以上是关于最小示例 Python 模块导入的问题的主要内容,如果未能解决你的问题,请参考以下文章

Python importlib(动态导入模块)

Python开发第十五篇模块的导入

Python导入模块问题

python 导入模块问题

Python 之 模块

pypy 的导入钩子(自定义模块加载器)不起作用