Я работаю над большим проектом в VSCode. У меня есть различные подпапки с множеством файлов .py и main.py в корне проекта. Я хочу импортировать различные функции из разных файлов, которые существуют в разных подпапках. Я считаю from x import y очень излишним процессом. Каков эффективный способ сделать это? Как это делает профессиональный разработчик Python?
my_project/
├── FolderA/
│ ├── __init__.py
│ └── module_a.py
├── FolderB/
│ ├── __init__.py
│ └── module_b.py
├── FolderC/
│ ├── __init__.py
│ └── module_c.py
├── __init__.py
└── main.py
Допустим, выше приведена моя структура, и я хочу вызывать функции в main.py из module_a.py, module_b.py и module_c.py. Спасибо.
Я попробовал следующее, но не могу продолжать делать это для 10/20 функций:
from FolderA.module_a import functionA
from FolderB.module_b import functionB
from FolderC.module_c import functionC
Также попробовал следующее, не помогло:
sys.path.append("D:\Python_workspace\software")






Чтобы настроить структуру проекта, измените файлы __init__.py в FolderA, FolderB и FolderC следующим образом:
FolderA/__init__.py
from .module_a import *
Если у вас есть несколько файлов в каталоге FolderA, вы можете импортировать все необходимые модули в файл __init__.py. Вот как это можно сделать, если у вас есть дополнительный файл с именем module_a2.py:
FolderA/__init__.py
from .module_a import * # for module_a.py
from .module_a2 import * # for module_a2.py
FolderB/__init__.py
from .module_b import *
FolderC/__init__.py
from .module_c import *
представьте, что у вас есть функция с именем add FolderA/module_a.py:
def add(a, b):
return a+b
Если вы хотите использовать эту функцию в main.py, вы можете использовать любой из следующих методов:
Импортируйте весь модуль FolderA:
import FolderA
print(FolderA.add(1, 2)) # output will be 3
Используйте импорт с подстановочными знаками, чтобы импортировать все из FolderA:
from FolderA import *
print(add(1, 2)) # output will be 3
Импортируйте функцию добавления непосредственно из папки A:
from FolderA import add
print(add(1, 2)) # output will be 3
С практической точки зрения (если указанное вами представление папок соответствует вашему проекту), если вы обнаружите, что у вас много папок с одним файлом в каждой, вы также можете переоценить, являются ли выбранные вами категории/группировки реалистичными. детализированный, и вы получите множество повторяющихся, змеиных импортов, которые вы показали. К сожалению, на этом этапе, имея по одному файлу в папке, вы мало что можете сделать для решения проблемы импорта, кроме реструктуризации дерева проекта.
Однако, если ваш проект уже находится в следующем формате (разница в нескольких файлах в каждой подпапке):
my_project/
├── FolderA/
│ ├── __init__.py
│ ├── module_a1.py
│ └── module_a2.py
├── FolderB/
│ ├── __init__.py
│ ├── module_b1.py
│ └── module_b2.py
├── FolderC/
│ ├── __init__.py
│ ├── module_c1.py
│ └── module_c2.py
├── __init__.py
└── main.py
Затем вы можете настроить импорт в __init__.py (предположим, вы находитесь в FolderA/__init__.py):
from module_a1 import fun1
from module_a2 import fun2
Затем в любом другом файле вы можете просто напрямую сослаться на каталог/пакет и получить то, что вы сейчас импортировали косвенно:
from FolderA import fun1, fun2
Книга Real Simple Python поддерживает этот стиль импорта. Я злоупотребляю импортом *, медленно переключаясь на импорт по функциям (легче отслеживать небольшой проект... Сложнее отслеживать, когда проект становится большим).