Почему pycharm не видит модули
Перейти к содержимому

Почему pycharm не видит модули

Почему pyCharm не видит библиотеки при импорте, хоть установка прошла успешно?

Не понимаю, почему pycharm не видит библиотеки при импорте, хоть их установка через консоль проходит успешно. Допустим, я устанавливаю библиотеку speech_recognition через терминал(используя pip), установка проходит успешно, но при попытке импортировать библиотеку, появляется ошибка: «ModuleNotFoundError: No module named ‘speech_recognition'». После я устанавливаю эту библиотеку через менеджер пакетов, теперь ее видно, но не хватает библиотеки pyAudio. При установке pyAudio через консоль, библиотеки также не видно, а при установке pyAudio через менеджер появляется ошибка, связанная именно с самим пакетом. И по такой же схеме со всеми библиотеками, только названия меняются, поэтому не могу с ними работать, что мне делать?

  • Вопрос задан более года назад
  • 12712 просмотров

1 комментарий

Простой 1 комментарий

Работа с модулями: создание, подключение инструкциями import и from

Python 3 логотип

Модулем в Python называется любой файл с программой (да-да, все те программы, которые вы писали, можно назвать модулями). В этой статье мы поговорим о том, как создать модуль, и как подключить модуль, из стандартной библиотеки или написанный вами.

Каждая программа может импортировать модуль и получить доступ к его классам, функциям и объектам. Нужно заметить, что модуль может быть написан не только на Python, а например, на C или C++.

Подключение модуля из стандартной библиотеки

Подключить модуль можно с помощью инструкции import. К примеру, подключим модуль os для получения текущей директории:

 import указывается название модуля. Одной инструкцией можно подключить несколько модулей, хотя этого не рекомендуется делать, так как это снижает читаемость кода. Импортируем модули time и random.
  
  

Использование псевдонимов

Если название модуля слишком длинное, или оно вам не нравится по каким-то другим причинам, то для него можно создать псевдоним, с помощью ключевого слова as.

  

Инструкция from

Подключить определенные атрибуты модуля можно с помощью инструкции from. Она имеет несколько форматов:

Первый формат позволяет подключить из модуля только указанные вами атрибуты. Для длинных имен также можно назначить псевдоним, указав его после ключевого слова as.
  
  

Следует заметить, что не все атрибуты будут импортированы. Если в модуле определена переменная __all__ (список атрибутов, которые могут быть подключены), то будут подключены только атрибуты из этого списка. Если переменная __all__ не определена, то будут подключены все атрибуты, не начинающиеся с нижнего подчёркивания. Кроме того, необходимо учитывать, что импортирование всех атрибутов из модуля может нарушить пространство имен главной программы, так как переменные, имеющие одинаковые имена, будут перезаписаны.

Создание своего модуля на Python

Теперь пришло время создать свой модуль. Создадим файл mymodule.py, в которой определим какие-нибудь функции:

Теперь в этой же папке создадим другой файл, например, main.py:
Выведет:
Поздравляю! Вы сделали свой модуль! Напоследок отвечу ещё на пару вопросов, связанных с созданием модулей:

Как назвать модуль?

Помните, что вы (или другие люди) будут его импортировать и использовать в качестве переменной. Модуль нельзя именовать также, как и ключевое слово (их список можно посмотреть тут). Также имена модулей нельзя начинать с цифры. И не стоит называть модуль также, как какую-либо из встроенных функций. То есть, конечно, можно, но это создаст большие неудобства при его последующем использовании.

Куда поместить модуль?

Туда, где его потом можно будет найти. Пути поиска модулей указаны в переменной sys.path. В него включены текущая директория (то есть модуль можно оставить в папке с основной программой), а также директории, в которых установлен python. Кроме того, переменную sys.path можно изменять вручную, что позволяет положить модуль в любое удобное для вас место (главное, не забыть в главной программе модифицировать sys.path).

Можно ли использовать модуль как самостоятельную программу?

Можно. Однако надо помнить, что при импортировании модуля его код выполняется полностью, то есть, если программа что-то печатает, то при её импортировании это будет напечатано. Этого можно избежать, если проверять, запущен ли скрипт как программа, или импортирован. Это можно сделать с помощью переменной __name__, которая определена в любой программе, и равна "__main__", если скрипт запущен в качестве главной программы, и имя, если он импортирован. Например, mymodule.py может выглядеть вот так:

Для вставки кода на Python в комментарий заключайте его в теги

Pycharm не видит установленные через pip библиотеки, помогите пожалуйста.

Проблема такова: устанавливаю библиотеки через pip install, в консоле написано то что библиотека успешно установлена, при работе с файлом в проекте, при попытке вызвать библиотеки через from, библиотеку не видно.

Голосование за лучший ответ

Используй виртуально окружения - project interpretуе - Add LocalEnv. Потом в консоле pycharm`а сделай pip freeze и посмотри правильно ли все встало

В начале моего пути к программированию появилась необходимость установить библиотеку requests. Установил её, но PowerShell всё равно ругается, что такой библиотеки нет. Попробовал PyCarm, тоже не видит. Посмотрел путь куда устанавливается библиотека и там всё хорошо, библиотека есть.

PS C:\Windows\system32> python -m pip install requests
Requirement already satisfied: requests in c:\users\dmn\appdata\local\programs\python\python38-32\lib\site-packages\requ
ests-2.26.0-py3.8.egg (2.26.0)
После продолжнительных мучений с поиском проблемы оказалось, что pip устанавливает библиотеку в . python38-32 а python в powershell запускается из папки . python38 а в pycharm вообще папка . python37 В pycharm путь правится в настройках pycharm

Для powershell пришлось в "переменные среды" менять пути на python38 powershell

windows 7 python v3.8

Сам часто встревал с данной проблемой, pycharm установил свежий, и не важно окружение добавил или без окружения библиотеки подгружаю, код работает программа пашет, но при клики по библиотеке CTRL+LCмыши не получается провалиться в библиотеку, и как правило она еще и подсвечена красным. Убивал на решение по целому дню. В итоге все заканчивалось установкой релиза pycharm на поколение или 2-а ниже и все работало. Библиотеки сразу виделись можно в них провалиться, ошибки непонятные не подсвечивались.
на оф сайте качал релизы

Короче говоря: импорты в Python

У всех такое бывало: пишешь в коде import foo , а foo не импортируется, хотя вот он лежит, родненький. Чтобы уметь разбираться с такими проблемами, давайте по-быстрому разберёмся в том, как работают импорты и что там происходит. Может, узнаем что-нибудь интересного.

Начнём с простого: чем может быть foo , чтобы Питон мог его импортировать? Тут три варианта:

  • файлом foo.py ;
  • модулем (директорией foo c файлом __init__.py внутри);
  • скомпилированным модулем на Си (даже не спрашивайте).

Теперь давайте разбираться в том, как Питон понимает, что нужно импортировать именно этот foo.py и как он его находит в файловой системе. Тут всего три варианта, которые интерпретатор пытается выполнить последовательно:

  • найти нужный модуль в директории, из которой запущен изначальный скрипт;
  • найти нужный модуль в каждом из путей, указанном в PYTHONPATH ;
  • найти нужный модуль в своих хитрых питонячьих путях, которые зависят от операционной системы и том, как установлен Питон.

Чтобы стало немного понятнее: первый способ обычно срабатывает, когда мы импортируем что-то из своего проекта, а второй — когда мы импортируем чей-то сторонний пакет.

Поиск модуля в текущей директории

Давайте разберёмся с первым пунктом. Рассмотрим такой пример: мы сделали pip install requests , запускаем python script.py , а наша структура каталогов выглядит вот так:

Чуете подвох, да? Модуль requests есть и в установленных пакетах и в нашем репозитории. Когда мы сделаем import requests в script.py , какой модуль импортируется?

Ответ: импортируется наш requests.py . Потому что по алгоритму выше, интерпретатор будет сперва искать модуль в директории с запускаемым скриптом ( script.py ), а там лежит наш.

Немного усложним наш пример: заменим наш файл requests.py нашим собственным модулем requests .

Теперь при import requests все ещё используется наш модуль, но поскольку он теперь модуль, произойдёт ещё одна вещь: выполнится весь код внутри __init__.py . Если там есть запросы к базе данных — они произойдут. Если есть какой-то вывод в консоль — что-то выведется в консоль. Хотя мы ещё никакой код не выполнили, только импортировали модуль.

Поэтому по возможности не держите в __init__.py никакой логики или кода. Только другие импорты.

Поиск модуля в PYTHONPATH

PYTHONPATH — это переменная окружения, в которой хранятся пути, по которым проходится интерпретатор Питона в поисках модулей. Прям в виде строки, разделены двоеточиями (или точками с запятой, зависит от ОС).

Когда интерпретатор начинает выполнение, он парсит значение этой переменной и кладёт в sys.path :

Если очень надо сказать интерпретатору, что импортировать пакеты нужно вот из этого каталога, можно впихнуть его и в PYTHONPATH и в sys.path .

Вот, например, запуск скрипта, который первым делом будет импортировать модули из /tmp/ (непонятно, зачем это нужно, но смешно): PYTHONPATH=/tmp/:$PYTHONPATH python script.py

А вот так можно сделать то же, только внутри кода (прямо перед всеми импортами):

Важно: оба эти способа нужно использовать, когда других вариантов совсем не осталось. Обычно если вы делаете что-то такое, вы скорее всего делаете неправильно. Это не значит, что такие хаки под запретом, но если их можно избежать, то их стоит избежать.

Резюме

  • Питон ищет модули сперва в текущей директории, потом PYTHONPATH aka sys.path .
  • PYTHONPATH и sys.path можно модифицировать, но если можно этого избежать — лучше избежать.
  • Если импортируем модуль, то при его импорте выполнится весь код в __init__.py , поэтому лучше не селить в этот файл много кода.

Бонусное чтение

  • Официальная документация про модули.
  • Как работают импорты в Python.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *