Импорт модулей из разных папок
У меня есть следующее расположение файлов:
python
|--main.py
|files
|-----folder1
|-----a.py,a1.py.....
|-----folder2
|-----b.py,b1.py....
Я хотел импортировать мои модули a и b.py в main.py. Для этого я использовал следующие команды в main.py:
a = 'C:/python/files/folder1'
sys.path.insert(0, a)
from files.folder1 import *
Однако я не могу импортировать модули из папки 1 (аналогично для папки2).
Я получаю сообщение об ошибке:
No module named files.folder1
Я не могу использовать команду импорта, поскольку в папке1, папке2 и так далее есть много файлов python.
Я что-то пропустил?
Ответы
Ответ 1
Когда я это делаю в Python 2.7, я использую:
import sys
sys.path.append('C:/python/files/folder1')
import a
import a1
UPDATE
Вот хак, который я создал для импорта всех модулей в каталог в словарь:
import os
import sys
dir_of_interest = 'C:/python/files/folder1'
modules = {}
sys.path.append(dir_of_interest)
for module in os.listdir(dir_of_interest):
if '.py' in module and '.pyc' not in module:
current = module.replace('.py', '')
modules[current] = __import__(current)
Я только что построил его, и он очень хакерский, но он может быть больше похож на то, что вы хотите. Итак, чтобы получить доступ к модулю, который вы хотите, вместо того, чтобы говорить module_name.thing
, вы бы сказали modules["module_name"].thing
Ответ 2
Быстрый ответ:
Добавьте файл __init__.py
(может быть пустым) в файлы папок, folder1 и folder2. Затем вы получили файлы пакетов с подпакетами folder1 и folder2. После этого вы можете импортировать с main.py вот так:
from files.folder1 import *
Ответ 3
Я не могу использовать команду импорта, поскольку в папке 1, папке2 есть много файлов python и так далее. Я что-то пропустил?
Я считаю, что часть, которую вам не хватает, - это файл __init__.py в каждой из папок. Этот файл должен содержать переменную __all__, в которой перечислены все подмодули, которые будут импортированы: from somepackage.subpackage import *
.
Все это изящно объяснено в разделе Python Tutorial раздела Пакеты.
Надеюсь, что это поможет: -)
Ответ 4
Если вы добавите folder1
к пути, это не означает, что вы можете импортировать folder1
в качестве модуля. Это означает, что вы можете импортировать файлы внутри папки1. Таким образом, вы можете сделать:
import a
import a1
Если вы хотите, чтобы folder1
был пакетом, из которых a
и a1
являются модулями, вам нужно поместить __init__.py
в folder1
, а затем сделать import folder1
. Если вы также захотите сделать from folder1 import *
и иметь этот импорт a
и a1
, вам нужно поместить код в свой __init__.py
, который импортирует a
и a1
.
Если у вас много файлов в папке, которую вы хотите импортировать структурированным способом, вы должны сделать эту папку в пакете.