在 Debian 和 Ubuntu 20.04 上

在 Debian 和 Ubuntu 20.04 上

我在多用户环境中工作,对 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

这些答案都不能回答跨平台的问题。以下是一个对我有用的解决方案:

  1. 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'
  1. 我检查了我当前的 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
  1. 我决定使用 /usr/lib/python3.8 来安装软件包,因为它是用户可以访问的全局路径。为此,我使用了--targetpip 中的参数。
$ 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
  1. 确认已安装:
$ pip freeze | grep loremipsum
loremipsum==1.0.5
$ python -c "import loremipsum"
$
  1. 不幸的是,要删除该包,您需要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'

相关内容