【发布时间】:2020-04-09 03:31:05
【问题描述】:
文件夹结构:
foo/
bar.py
__init__.py
test.py
foo/__init__.py 拥有import bar
我正在运行test.py,其中有import foo
如何让__init__.py 导入bar.py?
ModuleNotFoundError: No module named 'foo'
为什么 Python 不为我的包创建一个新的作用域并将导入的根设为 foo 目录?
相对路径似乎也不起作用(我收到了SyntaxError),尽管我正在寻找允许绝对路径的解决方案。
import .bar
两个不可接受的答案:
我不能使用
import foo.bar。我需要foo包拥有自己的独立层/范围,这样我就可以在我的计算机中的任何地方移动它并从任何地方导入它。这意味着根目录可能会改变,import foo.bar并不总是有效。我无法将
foo文件夹添加到我的路径中。显然,这会使路径变得混乱,并且很容易发生名称冲突。开始的感觉会说这个包的文件应该与使用它的路径分开。
也许有一种解决方案可以将此包的目录添加到仅适用于该包范围的路径中,在 __init__.py 的某个位置?
【问题讨论】:
-
from . import bar是正确的语法 -
哦,谢谢,我现在就用它。我仍然想要一个不需要相对路径的解决方案。
-
@DavidCallanan:你说你不想要相对路径,但你也拒绝
import foo.bar,这是进行绝对路径导入的正确方法。import X是总是绝对的;如果你想要相对导入,你必须使用from .Y import X(如果你要导入同级模块/包,Y可能什么都不是),每个PEP 328。 -
@ShadowRanger。打败我
-
@MadPhysicist
import foo.bar是一个绝对路径,但它仍然是相对于项目根目录的。它仍然不是绝对的,我不必输入"C:/Users/Me/Desktop/etc/etc"。同样,我期望import bar是一个绝对路径,但相对于包根目录而不是项目根目录,对我来说更有意义。
标签: python python-3.x python-import relative-import pep328