Python相对导入在命令行中不起作用
我的目录结构如下Python相对导入在命令行中不起作用,python,Python,我的目录结构如下 microblog/__init__.py urls.py views.py wsgi.py settings/__init__.py testing.py base.py local.py 在testing.py中,我有一个相对导入 from .base import * ... ...more cod
microblog/__init__.py
urls.py
views.py
wsgi.py
settings/__init__.py
testing.py
base.py
local.py
在testing.py中,我有一个相对导入
from .base import *
...
...more code
当我尝试使用microblog/settings目录下的命令行运行testing.py时
python测试.py
from .base import *
ValueError: Attempted relative import in non-package
为什么这不起作用。设置目录是带有init.py的有效包。仅当我更改了
from .base import *
到
我试图理解为什么相对本地导入失败,并在从命令行运行包含相对导入的“testing.py”包时给出一个ValueError。中icyrock的回答确切地澄清了我对python“repl”的理解 运行时在目录microblog/settings中
python testing.py
它实际上将测试放在包“main”中,不知道测试是包“settings”的一部分。而是将“testing.py”作为模块运行,作为其正常包层次结构的一部分,使用
python -m microblog.settings.testing
运行它时没有任何ValueError,因为python现在知道“测试”是包“设置”的一部分,其中相对本地导入“from.base import*”非常有意义 我想这个问题已经得到了回答。我刚才看到了。正如icyrocks在运行python testing.py时所说的那样。然后它会自动认为包是“main”。要从命令行运行带有实时导入的Package,我需要执行“python-m microblog.settings.testing”“为什么这不起作用。”错误消息告诉您原因!您从中执行导入的脚本,
testing
,不是一个包。它说测试是一个非包,这对我来说没有意义,因为我假设测试是包设置的一部分。但是正如您所说,我没有意识到“testing”实际上在包“main”中独立运行时。icyrock的回答为我澄清了这一点。关于stackoverflow的许多其他问题解决了相对导入的不同方面,这在我的案例中并不适用,因为我确实在一个包中使用了真正的dunder init.py进行了测试。即使作为包的一部分导入,测试
也不是包,而是在包的设置
中。
python -m microblog.settings.testing