我有2种情况将一些文件导入到主脚本中。
一种有效,另一种无效,我不能说出区别。
可行的场景
main.py
models
├── __init__.py
├── vggs.py
├── resnets.py
其中__init__.py
from .vggs import *
from .resnets import *
和main.py
from models import * # works fine
无效的场景
scripts
├── main.py
models
├── __init__.py
├── vggs.py
├── resnets.py
这次,我将模型文件夹附加到sys.path
中的main.py
:
sys.path.append('../models')
# These don't work --> ModuleNotFoundError: No module name models
import models
from models import *
# However, these work
from vggs import *
from resnets import *
为什么我可以导入每个文件,但是即使有__init__.py
也不能将整个模型文件夹作为模块导入?
答案 0 :(得分:1)
您将models
目录本身添加到了sys.path
列表中。现在,Python在该目录的内部中查找模块。没有../models/models/__init__.py
也没有../models/models.py
,所以import models
失败了。
将 parent 目录添加到sys.path()
:
sys.path.append('..')
Python然后找到../models/__init__.py
,因此import models
然后成功。
功能更强大的版本会首先确定script/
目录的绝对路径,然后将父路径添加到sys
:
import os.path
scripts_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.dirname(scripts_dir))
否则,..
相对于当前工作目录,而不一定是scripts/
目录。