Подтвердить что ты не робот

Импорт модулей из разных папок

У меня есть следующее расположение файлов:

    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.

Я что-то пропустил?

4b9b3361

Ответ 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.

Если у вас много файлов в папке, которую вы хотите импортировать структурированным способом, вы должны сделать эту папку в пакете.