python的相对地址导入包一直是个让人头疼的事。
比如你想从process.py
里导入父文件夹里的setting.py
├─ settings.py
│ __init__.py
│
├─analysis
│ process.py
不就from .. import settings
吗,结果就报了奇怪的错
>>> from .. import settings
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: attempted relative import beyond top-level package
参考了StackOverflow上的高赞回答,其实解决方法也很简单,在import之前加上这两句:
import sys
sys.path.append("..")
import setting # 直接导入父目录下的模块
意思是,把父目录添加到环境变量中,就可以直接import模块了。
不过有时候启动的位置不是当前文件的同级目录,可能还会报错,那就需要再加上这两句设置运行目录为当前文件所在的目录。
import os
os.chdir(os.path.dirname(__file__))
因此导入模块最万无一失的方法就是:
import os
import sys
os.chdir(os.path.dirname(__file__))
sys.path.append("..")
import settings