Python 3中的相对导入失败
考虑以下示例包:Python 3中的相对导入失败,python,Python,考虑以下示例包: example/ ├── bar.py ├── foo.py └── __init__.py foo.py只包含一行代码:from。导入条码 如果我从示例包根中执行python foo.py,我会得到: SystemError:父模块“”未加载,无法执行相对导入 我做错了什么?当您运行python foo.py时,foo.py不是示例模块的一部分。创建\uuuu main\uuuu.py以运行foo.py的相关部分(通常不应在顶层运行任何代码),切换到父目录,然后尝试pyth
example/
├── bar.py
├── foo.py
└── __init__.py
foo.py
只包含一行代码:from。导入条码
如果我从示例
包根中执行python foo.py
,我会得到:
SystemError:父模块“”未加载,无法执行相对导入
我做错了什么?当您运行
python foo.py
时,foo.py
不是示例
模块的一部分。创建\uuuu main\uuuu.py
以运行foo.py
的相关部分(通常不应在顶层运行任何代码),切换到父目录,然后尝试python-m example
例如,foo.py
:
def hello():
print('Hello, world!')
from . import foo
foo.hello()
\uuuu main\uuuuu.py
:
def hello():
print('Hello, world!')
from . import foo
foo.hello()
谢谢这似乎是可行的,你能解释一下你的评论吗“一般来说,它不应该在顶层运行任何代码”?您指的是
foo.py
,您的意思是foo.py
模块在刚导入时不应该运行任何代码吗?@DunPeal:是的,没错。更具体地说:当您以python a/b/c.py
的形式运行文件时,python会将a/b//code>添加到sys.path
。永远不要运行任何文件名应该是模块层次结构一部分的东西。始终位于父目录中,并使用-m
运行它。(如果您真的想,也可以在这里使用-m example.foo
)