无法使用__init__.py创建模块

时间:2019-04-27 11:26:29

标签: python python-module sys

我有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也不能将整个模型文件夹作为模块导入?

1 个答案:

答案 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/目录。