Можно ли импортировать файл без импорта всего дерева?

Допустим есть 2 файла:

main.py parsers.py

Файл main содержит точку входа и должен показать доступные парсеры. Можно ли импортировать содержимое парсера не запуская импорты сделанные внутри файла parsers? Main лишь собирает информацию и никогда не будет вызывать эти парсеры.


Ответы (2 шт):

Автор решения: n1tr0xs

Допустим можно изменить код 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')
→ Ссылка
Автор решения: asanisimov

Обычный пример 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.

→ Ссылка