当你的代码中有相对导入时,很容易出现以下错误信息:
Attempted relative import in non-package
这是由于你直接执行了包内的脚本。解决方法是在包外import此脚本。
我们看一个例子,我有如下文件结构:
Test/
├── package1
│ ├── __init__.py
│ ├── script1.py
│ └── script2.py
└── test.py
脚本内容如下:
script1.py
value = 1
script2.py
from .script1 import value
def func():
print(value)
if __name__ == '__main__':
func()
脚本2使用了相对导入。我的目的是测试func()
函数。当我直接执行script2.py
这个脚本时,会执行失败,是由于当你直接执行script2.py
时,.
并没有被解释为当前包package1
,而被解释为__main__
。为了解决此问题,你可以在package1
外面的test.py
脚本中书写如下代码:
from package1 import script2
script2.func()
这样,就可以看到func()
函数的输出了。
另一种方式是直接以模块的方式执行包内的某个脚本,即:
python -m package1.script2
总之,一句话:当你的package里有相对import代码时,不要直接执行此package内的脚本,请在此package外import后执行,或者使用-m参数。
Ref