Python Relative import does not work from command line gives ValueError
我的目录结构如下
1 2 3 4 5 6 7 8 | microblog/__init__.py urls.py views.py wsgi.py settings/__init__.py testing.py base.py local.py |
在testing.py中我有一个相对导入
1 2 3 | from .base import * ... ...more code |
当我尝试从目录微博/设置中的命令行运行testing.py时
python testing.py
1 2 | from .base import * ValueError: Attempted relative import in non-package |
为什么这不起作用。 settings目录是一个带有init.py的有效包。 我不从命令行获取ValueError如果我改变了
1 | from .base import * |
至
1 | from base import * |
我试图理解为什么相对本地导入失败,并在我从命令行运行带有相对导入的"testing.py"包时给出ValueError。
这篇文章中的icyrock的答案澄清了我对python"repl"的理解。
在我运行的目录微博/设置中
1 | python testing.py |
它实际上将测试放在包"main"中,并且它不知道测试是包"设置"的一部分。 而是使用此方法将"testing.py"作为其正常包层次结构的一部分运行
1 | python -m microblog.settings.testing |
运行它没有任何ValueError因为现在python知道"testing"是包"settings"的一部分,其中相对本地导入"from .base import *"非常有意义。