我在多用户环境中工作,对 Python 比较陌生。有问题的机器运行 Ubuntu 16.04,我们使用的是 Python 2.7。我个人安装了几个附加模块,例如 tensorflow、keras 和一些其他相关模块,我相信我使用了 pip 安装程序(来自 /usr/local/lib/python2.7/ 的 pip 18.0)来安装这些模块(sudo pip install X
)。
几个月来,我一直使用所有这些模块成功运行 Python 脚本,但另一个用户无法运行使用我安装的任何模块的任何 Python 代码。即使是仅用于导入模块的一行脚本,例如:
import tensorflow
运行失败,生成 ImportError(我仅粘贴最后几行):
File "/usr/local/lib/python2.7/dist-
packages/tensorflow/python/ops/variable_scope.py", line 24, in <module>
import enum # pylint: disable=g-bad-import-order
ImportError: No module named enum
我做错了什么,导致其他用户看不到这些模块,我该如何修复它?
答案1
我强烈建议避免python-pip
在生产环境中使用。以这种方式安装的模块不会在系统更新期间更新,这可能会导致永远无法修补的漏洞……
尽管如此,pip 默认只在调用用户的 $HOME 中安装模块。要让 pip 在“系统范围内”安装,请使用开关--system
。
有关详细信息,请参阅pip install --help
输出
编辑
--system
看起来是 Debian 特有的选项。
binarym@avalon:/tmp/python-pip-18.1/debian/patches$ grep -- '--system' *
set_user_default.patch:+:ref:`--system <install_--system>` option to ``pip install``.
set_user_default.patch:+ '--system',
感谢@co2f2e 的评论。
答案2
我可以确认pip3 --help
没有显示--system
开关。但它被接受了。另外,我必须以 root 身份使用它。简单地做sudo pip3 install x --system
失败了。
例子。
sudo su
pip3 install x --system
答案3
在 Debian 和 Ubuntu 20.04 上
pip
这与Debian 或 Ubuntu 存储库提供的版本配合良好apt
。
$ pip --version
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)
$ pip install --help
Install Options:
--system Install using the system scheme (overrides --user on Debian systems)
$ pip uninstall modulename
$ sudo pip install --system modulename
但是,当从 PyPI 存储库pip
升级时,它将不起作用:pip
$ pip --version
pip 22.2.2 from /usr/local/lib/python3.8/dist-packages/pip (python 3.8)
笔记:不幸的是,Ubuntu 22.04 不再提供此选项。
答案4
这些答案都不能回答跨平台的问题。以下是一个对我有用的解决方案:
- loremipsum未安装
$ sudo pip freeze | grep loremipsum
$ python -c "import loremipsum"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'loremipsum'
- 我检查了我当前的 python 路径
$ python -c "import sys; print('\n'.join(sys.path))"
/usr/lib/python38.zip
/usr/lib/python3.8
/usr/lib/python3.8/lib-dynload
/home/me/.local/lib/python3.8/site-packages
/usr/local/lib/python3.8/dist-packages
/usr/lib/python3/dist-packages
- 我决定使用 /usr/lib/python3.8 来安装软件包,因为它是用户可以访问的全局路径。为此,我使用了
--target
pip 中的参数。
$ sudo pip install --target=/usr/lib/python3.8 loremipsum
Collecting loremipsum
Using cached loremipsum-1.0.5-py3-none-any.whl
Installing collected packages: loremipsum
Successfully installed loremipsum-1.0.5
- 确认已安装:
$ pip freeze | grep loremipsum
loremipsum==1.0.5
$ python -c "import loremipsum"
$
- 不幸的是,要删除该包,您需要
rm -rf
对该位置进行操作。这是一个已知问题找到这里。因此,这是目前的解决方法。请密切注意末尾*
有loremipsum*
多个需要删除的包。
$ sudo rm -rf /usr/lib/python3.8/loremipsum*
$ pip freeze | grep loremipsum
$ python -c "import loremipsum"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'loremipsum'