Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python相对导入在命令行中不起作用_Python - Fatal编程技术网

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