-
The Problem
- The Error
-
Process of Debugging
- Additional Thoughts
- Thoughts on the problem
- Links
- Outro
The Problem
Today I stumbled upon to a not a very straightforward issue while using IntelliJ IDEA via Python Plugin, and PyCharm. In other words IntelliJ IDEA and PyCharm not recognizing installed packages inside virtual environment.
When running the script via Run
button, it blows up with an error but when running the script from the command line it runs with no errors, as it supposed to.
The Error (via Run button)
$ python wierd_error.py
Traceback (most recent call last):
File "C:Userspath_to_file", line 943, in <module>
import bcrypt
ModuleNotFoundError: No module named 'bcrypt'
Enter fullscreen mode
Exit fullscreen mode
- Python script is executing.
- When trying to import a package blows up with an error.
The error is clearly says:
Hey man, there’s no
bcrypt
module, just go and install it.
BUT (DUDE, THE MODULE IS RIGHT THERE! COME ON!) it was already installed to the virtual environment, and I’m not really sure if I did something wrong, or the program didn’t do what I expected. But at that moment I wanted to break the table in half.
Before running the script I’ve created a env
folder for a project to isolate it from globally installed packages.
python -m venv env
Enter fullscreen mode
Exit fullscreen mode
Then I activate it:
$ source env/Scripts/activate
(env)
Enter fullscreen mode
Exit fullscreen mode
After that, I installed a few packages via pip install
. They were installed to env
folder as they should, and I confirmed it via pip list
command to print out all install packages in the virtualenv
.
$ pip list
Package Version
---------- -------
bcrypt 3.2.0 <-- It's there!
pip 21.1.1
setuptools 56.0.0
Enter fullscreen mode
Exit fullscreen mode
So why on Earth does the script blows up with an error while using Run
button but runs smoothly from the command line both inside IntelliJ IDEA and PyCharm?
Process of debugging
Idea 1. Tinker everything inside Project Structure settings
The following examples will be from IntelliJ IDEA but almost the same thing happening in the PyCharm.
I was trying to change project interpreter SDK/Setting, create module (inside project structure settings) for absolute no reason just to test if it helps. There’s not much I could say about this idea, but this process goes in circle for a few hours in and Googling related things at the same time.
Idea 2. Test in other IDE
After trying the same thing for a few hours I tried to test if the same behavior will be in other IDE’s such as PyCharm and VSCode. And the answer is «Yes», same behavior, in terminal runs, via Run
button explodes with an error.
At that point I understand that something happening inside IDE since running from a command line everything runs as it should, so I focused on figuring out what causes error inside IDE.
Idea 3. Google «pycharm not recognizing installed packages»
At this point I was trying to formulate a problem in order to google it. The first Google results was exactly what I was looking for PyCharm doesn’t recognise installed module.
This is the answer that helped to solve the problem which said:
Pycharm is unable to recognize installed local modules, since python interpreter selected is wrong. It should be the one, where your pip packages are installed i.e. virtual environment.
The person who answer the question had the similar problem I had:
I had installed packages via pip in Windows. In Pycharm, they were neither detected nor any other Python interpreter was being shown (only python 3.6 is installed on my system).
Step 4. Change Project SDK to python.exe from virtual environment
In order to make it work I first found where python.exe
inside virtual environment folder is located, and copied the full path.
Then, go to Project Structure
settings (CTRL+ALT+SHIFT+S) -> SDK's
-> Add new SDK
-> Add Python SDK
-> System interpreter
-> changed existing path to the one I just copied. Done!
Path changed from this:
To this:
One thing left. We also need to change Python interpreter path inside Run Configuration
to the one that was just created inside System Interpreter
under Project Structure
:
Changing Python interpreter path from the default one:
Additional Thoughts
I’m not creating another virtual environment (venv
) that PyCharm provides because I already create it from the command line beforehand, that’s why I change path inside System Interpreter.
It can be also achieved by creating new Virtual Environment
instead of creating it from command line (basically the same process as described above):
-
Set
Base Interpreter
to whatever Python version is running. -
Make sure that
Project SDK
(Project Structure
window) is set to the one fromVirtual Environment
(Python 3.9 (some words)
). -
Open
Run Configuration
->Python Interpreter
->Use specific interpreter
path is set topython.exe
path from thevenv
folder (e.g. newly createdvirtual environment
).
Note: When using such method, Bash commands not found for unknown for me reason.
$ which python
bash: which: command not found
() <- tells that you're currently in virtualenv
Enter fullscreen mode
Exit fullscreen mode
But when creating env
manually (python -m venv env
), Bash commands are working.
Thoughts on the problem
I thought that IntelliJ IDEA, PyCharm handles such things under the hood so end user doesn’t have to think about it, just create an env
, activate it via $ source env/Scripts/activate
and it works.
I should skip tinkering step right away after few minutes of trying to formulate the problem correctly and googling it instead of torture myself for over an hour.
In the end, I’m happy that I’ve stumbled upon such problem because with new problems it will be much easier to understand what steps to do based on the previous experience.
Links
- StackOverflow question
- StackOverflow answer
- Googling the problem
Outro
If you have anything to share, any questions, suggestions, feel free to drop a comment in the comment section or reach out via Twitter at @dimitryzub.
Yours,
Dimitry
В Python может быть несколько причин возникновения ошибки ModuleNotFoundError: No module named ...
:
- Модуль Python не установлен.
- Есть конфликт в названиях пакета и модуля.
- Есть конфликт зависимости модулей Python.
Рассмотрим варианты их решения.
Модуль не установлен
В первую очередь нужно проверить, установлен ли модуль. Для использования модуля в программе его нужно установить. Например, если попробовать использовать numpy без установки с помощью pip install будет следующая ошибка:
Traceback (most recent call last):
File "", line 1, in
ModuleNotFoundError: No module named 'numpy'
Для установки нужного модуля используйте следующую команду:
pip install numpy
# или
pip3 install numpy
Или вот эту если используете Anaconda:
conda install numpy
Учтите, что может быть несколько экземпляров Python (или виртуальных сред) в системе. Модуль нужно устанавливать в определенный экземпляр.
Конфликт имен библиотеки и модуля
Еще одна причина ошибки No module named — конфликт в названиях пакета и модуля. Предположим, есть следующая структура проекта Python:
demo-project
└───utils
__init__.py
string_utils.py
utils.py
Если использовать следующую инструкцию импорта файла utils.py, то Python вернет ошибку ModuleNotFoundError
.
>>> import utils.string_utils
Traceback (most recent call last):
File "C:demo-projectutilsutils.py", line 1, in
import utils.string_utils
ModuleNotFoundError: No module named 'utils.string_utils';
'utils' is not a package
В сообщении об ошибке сказано, что «utils is not a package». utils — это имя пакета, но это также и имя модуля. Это приводит к конфликту, когда имя модуля перекрывает имя пакета/библиотеки. Для его разрешения нужно переименовать файл utils.py.
Иногда может существовать конфликт модулей Python, который и приводит к ошибке No module named.
Следующее сообщение явно указывает, что _numpy_compat.py в библиотеке scipy пытается импортировать модуль numpy.testing.nosetester
.
Traceback (most recent call last):
File "C:demo-projectvenv
Libsite-packages
scipy_lib_numpy_compat.py", line 10, in
from numpy.testing.nosetester import import_nose
ModuleNotFoundError: No module named 'numpy.testing.nosetester'
Ошибка ModuleNotFoundError
возникает из-за того, что модуль numpy.testing.nosetester
удален из библиотеки в версии 1.18. Для решения этой проблемы нужно обновить numpy и scipy до последних версий.
pip install numpy --upgrade
pip install scipy --upgrade
Что означает ошибка ModuleNotFoundError: No module named
Python ругается, что не может найти нужный модуль
Python ругается, что не может найти нужный модуль
Ситуация: мы решили заняться бигдатой и обработать большой массив данных на Python. Чтобы было проще, мы используем уже готовые решения и находим нужный нам код в интернете, например такой:
import numpy as np
x = [2, 3, 4, 5, 6]
nums = np.array([2, 3, 4, 5, 6])
type(nums)
zeros = np.zeros((5, 4))
lin = np.linspace(1, 10, 20)
Копируем, вставляем в редактор кода и запускаем, чтобы разобраться, как что работает. Но вместо обработки данных Python выдаёт ошибку:
❌ModuleNotFoundError: No module named numpy
Странно, но этот код точно правильный: мы его взяли из блога разработчика и, по комментариям, у всех всё работает. Откуда тогда ошибка?
Что это значит: Python пытается подключить библиотеку, которую мы указали, но не может её найти у себя.
Когда встречается: когда библиотеки нет или мы неправильно написали её название.
Что делать с ошибкой ModuleNotFoundError: No module named
Самый простой способ исправить эту ошибку — установить библиотеку, которую мы хотим подключить в проект. Для установки Python-библиотек используют штатную команду pip или pip3, которая работает так: pip install <имя_библиотеки>
. В нашем случае Python говорит, что он не может подключить библиотеку Numpy, поэтому пишем в командной строке такое:
pip install numpy
Это нужно написать не в командной строке Python, а в командной строке операционной системы. Тогда компьютер скачает эту библиотеку, установит, привяжет к Python и будет ругаться на строчку в коде import numpy.
Ещё бывает такое, что библиотека называется иначе, чем указано в команде pip install. Например, для работы с телеграм-ботами нужна библиотека telebot, а для её установки надо написать pip install pytelegrambotapi
. Если попробовать подключить библиотеку с этим же названием, то тоже получим ошибку:
А иногда такая ошибка — это просто невнимательность: пропущенная буква в названии библиотеки или опечатка. Исправляем и работаем дальше.
Вёрстка:
Кирилл Климентьев