Не могу создать модуль с __init__.py - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть 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 Ответ

1 голос
/ 27 апреля 2019

Вы добавили сам каталог 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/.

...