0 / 0 / 0
Регистрация: 03.04.2017
Сообщений: 21
1

Проблема с импортом модулей

13.12.2018, 16:49. Показов 19470. Ответов 4

Author24 — интернет-сервис помощи студентам
Добрый день!
Не так давно я начал изучать Python, до него изучал Java. Пока просто выполняю упражнения и читаю книжки. Пишу код в PyCharm и VS Code.

Решил разобраться с пакетами и модулями. После Java и mavin я не ожидал каких то проблем, разместил во всех папках проекта файл __init__.py и думал что все будет работать. В PyCharm все работало отлично, а при попытки запустить упражнение из консоли выскочила ошибка: ModuleNotFoundError.

Структура части проекта:
Кликните здесь для просмотра всего текста

Код
D:
└───exercises_python
    │   .gitignore
    │   __init__.py 
    │
    ├───algorithms
    │       main.py
    │       sorting_algorithms.py
    │       __init__.py
    │
    .
    .
    .


Запускаемый файл:
Кликните здесь для просмотра всего текста

Python
1
2
3
4
5
6
7
8
9
10
11
12
import random
import algorithms.sorting_algorithms
 
arr = [i for i in range(100)]
random.shuffle(arr)
 
print('Bubble Sort')
print('old  array:', arr)
arr = algorithms.sorting_algorithms.bubble_sort(arr)
print('sort array:', arr)
 
random.shuffle(arr)


Сообщение об ошибке:
Кликните здесь для просмотра всего текста
Python
1
2
3
4
Traceback (most recent call last):
  File ".\main.py", line 2, in <module>
    import algorithms.sorting_algorithms
ModuleNotFoundError: No module named 'algorithms'


Если импорт привести к виду:
Кликните здесь для просмотра всего текста
Python
1
2
3
import random
import sorting_algorithms
...

то ругается pylint, но код в терминале выполняется.

Подскажите, в чем проблема и как правильно размещать пакеты и модули?
Версия Python 3.7.1
Миниатюры
Проблема с импортом модулей   Проблема с импортом модулей   Проблема с импортом модулей  

0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.12.2018, 16:49
Ответы с готовыми решениями:

Проблема с импортом pandas
Привет! Комп Мак на М2. Использую VsCode. Версия пайтона 3.9.6 (пайтон3 - 3.11.0). Во время импорта...

Проблема с импортом классов
Есть пара модулей в проекте: classes.py и main.py В classes.py прописано два класса: class...

Проблема с импортом PyQt5
Здравствуйте участники форума.Возникла проблема, надеюсь кто либо поможет решить(свои мозги не...

Проблема с импортом файлов
Есть следующая структура проекта, которая показана на прикреплённом скриншоте. Требуется в файл...

Проблема с импортом модулей
Здравствуйте, у меня тут проблема с импортом. Не знаю почему, вроде верно но почему-то говорит...

4
Эксперт Python
5418 / 3842 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
13.12.2018, 19:43 2
Лучший ответ Сообщение было отмечено alex_filatov как решение

Решение

Цитата Сообщение от alex_filatov Посмотреть сообщение
не ожидал каких то проблем, разместил во всех папках проекта файл __init__.py и думал что все будет работать
Зачем вам __init__.py в верхнем каталоге. Каталог проекта это просто каталог проекта - вы же не будете его импортировать?
Внутри него расположение файлов может быть таким:


Код
project
----src
--------app.py
--------package1
------------__init__.py
------------module.py
--------package2
------------__init__.py
------------module.py
----test
--------test_cases.py
----doc
--------document.md
----.gitignore
----license.txt
----readme.md
  • Причем каталогов test, doc и src может вообще не быть, а все что находится в них, располагаться прямо внутри каталога проекта. Необходимость их наличия определяется разработчиком.
  • А вот сами пакеты (в python'е это логически сгруппированный набор модулей), естественно, должны иметь свой каталог, который и будет являться их импортируемым именем.
    Файл app.py или main.py - неважно как вы его назовете - будет запускаемым скриптом, в котором вы будете импортировать нужны пакеты из проекта по абсолютному имени и
    что там запускать.
  • Внутри пакетов (package1, package2 и т.д. - число пакетов в проекте, естественно, ограничивается лишь фантазией разработчика) запускаемых скриптов быть не должно.
    Это антипаттерн, по мнению Гвидо.
    Хотя, есть исключение - особый файл с именем __main__ .py(о нем погуглите отдельно).
  • Внутри пакетов располагаются библиотечные модули, которые должны поддерживать только импорт, но никак не исполнение. То есть блока if __name__ == "__main__": в них быть не должно
    (кроме случая наличия особого файла __main__.py), как и любых других явных вызовов функций на уровне модуля.
  • Если один модуль нуждается в функциях другого модуля, который располагается на этом же уровне пакета,
    то используется относительный импорт: from .module import что_то, что позволяет не харкодить имя каталога, который разработчик может внезапно решить переименовать
    (и тогда пришлось бы переименовывать и все захардкоженые имена в импортах).
    Важное примечание: файлы с относительным импортом невозможно выполнить, поэтому такой импорт должен использоваться исключительно внутри модулей пакета.
  • Касательно файлов __init__.py. Если у вас они пустые, то они вам не нужны вообще, так как в третьей версии Python любой каталог со скриптом уже считается пакетом, даже если вы об этом и не думали :-)
  • Непустой __init__.py должен содержать какую-то нужную вам логику инициализации,
    а также возможное импортирование имен субпакетов\субмодулей или объектов из них в пространство имен верхнего пакета, для того,
    чтобы впоследствии использовать импорты кода из этих вложенных модулей без полной квалификации пути (по полной иерархии путей).
.

P.S. Для достижения дзена зайдите на гитхаб репозиторий любого крупного python пакета и посмотрите как все организовано.
Официальная документация. Modules.

Модули, пакеты и система импорта. Слайды лекции 10 курса Лебедева по Python.
2
0 / 0 / 0
Регистрация: 03.04.2017
Сообщений: 21
13.12.2018, 20:18  [ТС] 3
Спасибо за развернутый ответ, пойду изучать документацию и слайды)
А все-таки, объясните, есть ли возможность достучаться до модуля, который расположен выше по структуре проекта?
Т.е. примерно такая ситуация:

Кликните здесь для просмотра всего текста

Код
project
----src
--------app
------------__init__.py
------------main.py
--------modules
------------__init__.py
------------module.py


Возможно ли из main достучаться до module?
0
Эксперт Python
5418 / 3842 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
13.12.2018, 21:19 4
Цитата Сообщение от alex_filatov Посмотреть сообщение
достучаться до модуля, который расположен выше по структуре проекта?
Python
1
from ..module import что_то
Python
1
from ...module import что_то
Python
1
from ....module import что_то
Python
1
from .....module import что_то
.... конечное число уровней подъёма вверх мне неизвестно.

Пример:
\src\package1\module.py
Python
1
x = 10
src\package1\subpackage1\subpackage11\module.py
Python
1
2
3
4
5
6
from ...module import x
 
 
 
def hello11():
    print('hello, I is {} from {}'.format(__file__, __package__),x)

\src\app.py
Python
1
2
from package1.subpackage1.subpackage11.module import hello11
hello11()
Код
hello, I is D:\INSTALL\Python3\PROJECTS\SCRIPTS\project\src\package1\subpackage1\subpackage11\module.py from package1.subpackage1.subpackage11 10
Добавлено через 7 минут
P.S. Но это только при подъеме вверх. Если же нужно что-то импортировать из рядом лежащего пакета (пакеты на одном уровне - и один модуль хочет залезть в каталог другого модуля ), то только полный квалифицированный путь:
Python
1
from package1.subpackage1.module import x
либо можно попробовать использовать слияние пространств имен пакетов на уровне общего __init__.py.
1
0 / 0 / 0
Регистрация: 23.10.2018
Сообщений: 1
29.01.2020, 16:08 5
Спасибо за ясное представление о модулях и пакетах! У меня вопрос связанный с этим.
Не подскажете ли, как правильно скормить pylint иерархию "модуль-пакеты" для проверки?
0
29.01.2020, 16:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.01.2020, 16:08
Помогаю со студенческими работами здесь

Проблемы с импортом модулей , при использовании  jupyter notebook
Не удается импортировать numpy, хотя он был установлен в составе Anaconda. Почему такое может...

Проблема с импортом
Помогите в чем может быть проблема Не работает резервное восстановление базы на другой машине...

Проблема с импортом C++ структур
Есть библиотека с функциями: extern &quot;C&quot; { __declspec( dllexport ) TypeDef_ERR_DLL ...

Проблема с импортом видео
Записал несколько видео на телефоне и перекинул их в unity. В проводнике и в других программах...

Проблема с импортом класса
Создал класс и когда импортирую его в другой файл и пытаюсь там вызвать выходит ошибка: Can't...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru