Можно ли импортировать файл без импорта всего дерева?
Допустим есть 2 файла:
main.py parsers.py
Файл main содержит точку входа и должен показать доступные парсеры. Можно ли импортировать содержимое парсера не запуская импорты сделанные внутри файла parsers? Main лишь собирает информацию и никогда не будет вызывать эти парсеры.
Ответы (2 шт):
Допустим можно изменить код parsers.py так:
if __name__ == '__main__':
import ...
# ваш код
UPD:
main.py
import parser
parser.py
if __name__ == '__main__':
import test
test.py
if __name__ != '__main__':
print('imported')
Обычный пример parser.py
import typing as t
A = 123
B = 888
main.py
from parser import *
print(dir())
# Output: ['A', 'B', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 't']
Как видно из примера - импортируется все включая импортируемые библиотеки.
Добавление __all__. тут вы перечисляете все публичные объекты модуля которые должны быть открыты для импорта.
parser.py
import typing as t
__all__ = ['A']
A = 123
B = 888
main.py
from parser import *
print(dir())
# Output: ['A', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
Как видно, импортировалась только переменная "A" которая добавлена в __all__ .
Замечу, что такое можно проделывать не только с модулями, но и с пакетами в __init__.py.