Я использую ubuntu 20.04 для написания программ на Python. Я обычно устанавливаю пакеты python без префикса sudo
. Но я заметил, что если я перейду в режим sudo, а затем попытаюсь импортировать ранее установленный пакет python, он вызовет ошибку ModuleNotFoundError: Нет модуля с именем 'xxx'
. Но если я выйду из режима sudo, все снова будет в порядке.
В чем может быть причина? Может быть, в режиме sudo путь импорта не добавляется в переменную PATH
? Но это не похоже на причину, если вы проверите мои переменные PATH
ниже:
Обычный режим пользователя:
/usr/local/cuda-10.2/bin:/home/myusername/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Корневой режим:
/usr/local/cuda-10.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:
Python не использует переменную среды PATH
. Процесс определения того, где искать модули, довольно сложен, и я не буду здесь вдаваться в подробности, но в конечном итоге все пути содержатся в переменной sys.path
. Используйте следующий однострочник для печати этого списка:
python3 -c "import sys; print(sys.path)"
(Обратите внимание, что он содержит только существующие каталоги.)
На выходе вы увидите папку внутри вашей домашней папки. Это каталог пакетов сайта вашего пользователя, функция, описанная в PEP 370 . И это каталог, в который pip3
по умолчанию устанавливает пакеты, если вы запускаете его от своего «обычного» пользователя.
Если вы теперь переключитесь на пользователя root
, python будет искать модули в домашней папке пользователя root
, то есть / root
, поэтому он не сможет найти пакеты в каталоге пакетов сайта «обычного» пользователя.
В целях разработки, Я бы рекомендовал использовать виртуальные среды, такие как venv
.
Моя проблема (в Debian) заключалась в том, что python
запускал python3, а sudo python
запускал python2.
Исправлено запуском sudo python3 app.py
Предполагается, что модули установлены для root.