最小示例 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
main.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 模块导入的问题的主要内容,如果未能解决你的问题,请参考以下文章