Не удается импортировать модуль из подкаталога - PullRequest
0 голосов
/ 14 октября 2018

На высоком уровне структура моего проекта выглядит следующим образом.

dir/
    moduleA/
            __init__.py
            file1.py
            file2.py
    main.py

file2.py содержит некоторую глобальную переменную, которую я импортирую в file1.py

# --- file2.py schema ---

SOME_GLOBAL_VARIABLE = 1

.

# --- file1.py schema --- 

from moduleA.file2 import SOME_GLOBAL_VARIABLE

class MyClass():
    def __init__(self):
         self.some_attr = SOME_GLOBAL_VARIABLE   

    def run():
         print(self.some_attr)     

Когда я запускаю main.py ниже, который создает экземпляр MyClass, код запускается без ошибок.

# --- main.py ---

from moduleA.file1 import MyClass

x = MyClass()
x.run()

Однако, когда я открываю открытую консоль Python иВыполните ниже для импорта MyClass из file1.py Я получаю ошибку импорта, что нет модуля с именем moduleA.

from moduleA.file1 import MyClass

# (... some traceback statements)
from moduleA.file2 import SOME_GLOBAL_VARIABLE
ModuleNotFoundError: No module named 'moduleA'

Как это возможно, когда Python явно находит moduleA / file1.py, в противном случае он не может попытаться выполнить строку

from moduleA.file2 import SOME_GLOBAL_VARIABLE

Мне кажется странным, что он работаетбез ошибок, когда я запускаю скрипт main.py.

Полагаю, это связано с моим отсутствием понимания того, как Python точно импортирует модули, поэтому любая помощь очень ценится.Я попытался добавить файл init .py в moduleA, но это не решило проблему.

В случае, если эта информация актуальна, путь some_path / dir находится на моем PYTHONPATH.

1 Ответ

0 голосов
/ 14 октября 2018

Это вызвано из-за переменной __package__.
Чтобы увидеть ее значение, добавьте print(__package__) в file1.py перед импортом.

При прямом запуске file1.py вы можете видеть, что __package__ равно None.
Но, с другой стороны, при запуске main.py, при импорте file1.py (и, следовательно, при его запуске), Значение __package__file1.py) внезапно moduleA, поэтому python может импортировать moduleA.file2.

...