Не могу импортировать модули Python из пакета - PullRequest
0 голосов
/ 04 мая 2018

Мой путь к проекту выглядит так:

main.py
modules/
     __init__.py
     databaseManager.py
     sync.py
     excel.py

в main.py:

from modules.databaseManger import addExcelToDb, searchInDbAll
from modules.excel import search, showExcelDirContents
from modules.sync import syncExcelAndDB

и, например, в database.py:

from modules.excel import showExcelDirContents
from modules.sync import insertExcelNameToSyncDb

но когда я запускаю main.py, я получаю эту ошибку:

Traceback (most recent call last):
 File "main.py", line 6, in <module>
   from modules.databaseManger import searchIn
ImportError: cannot import name 'searchInDbAll'

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

Мне нужны некоторые примеры import ing.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Это круговой импорт выпуск.

Пояснение:

Вы начинаете с запуска импорта модуля databaseManager.

Во время этого databaseManager код начинает импортировать excel.

Во время импорта excel код excel пытается получить функцию searchInDbAll() из databaseManager. Но в этот момент эта функция не существует - потому что databaseManager находится в процессе импорта excel, и он не начал определять какие-либо функции.

Как исправить:

В модулях, где существуют циклические конфликты импорта, импортируйте модули вместо функций. Например, измените это:

from modules.excel import showExcelDirContents

к этому:

from modules import excel

И, конечно, вы должны затем изменить соответствующие вызовы функций с showExcelDirContents() на excel.showExcelDirContents().

Вы должны сделать это в своих модулях databaseManger, excel и sync. С этим исправлением я действительно смогу запустить твой код.

И да, удалить добавляет к sys.path, это неправильно

0 голосов
/ 04 мая 2018

Вы можете добавить к своему пути, где вы разместите свои модули, как это:

import sys
sys.path.append('modules/')

или

import sys
sys.path.append('c:/mycode/stuff/modules/')

примечание это косая черта, или вы можете использовать двойную обратную косую черту, как \\

Тогда просто поместите файл databaseManger.py в / modules

Вам также понадобится файл в папке / modules с именем:

__init__.py

Это просто пустой файл

Тогда вы должны быть в состоянии сделать:

from databaseManger import addExcelToDb, searchInDbAll

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...