我正在使用 ubuntu 20.04 编写 python 程序。我通常安装不带前缀的 python 包sudo
。但我注意到,如果我进入 sudo 模式,然后尝试导入以前安装的 python 包,它会引发ModuleNotFoundError: No module named '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:
答案1
Python 不使用PATH
环境变量。确定在哪里查找模块的过程相当复杂,我不会在这里详细介绍,但最终,所有路径都包含在变量中sys.path
。使用以下一行代码打印该列表:
python3 -c "import sys; print(sys.path)"
(请注意,它仅包含现有目录。)
在输出中,您将看到主文件夹中有一个文件夹。这是您用户的 site-packages 目录,此功能在PEP 370pip3
。如果您以“普通”用户身份运行它,则该目录是默认安装软件包的目录。
如果您现在切换到root
用户,python 将在用户的主文件夹中查找模块root
,即/root
,因此它不会在“普通”用户的站点包目录中找到包。
出于开发目的,我建议使用虚拟环境,例如venv
。
答案2
我的问题(在 debian 上)是python
运行 python3 并sudo python
运行 python2。
通过运行修复sudo python3 app.py
这假定模块已为 root 安装。
答案3
做就是了sudo pip install <package-name>
答案4
对我来说,解决方案不是这样写:
sudo python test.py
写:
sudo /home/dietpi/project/env/bin/python test.py