apt-get 安装 vs pip 安装

Vin*_*hik 121 python apt software-installation pip

对于下载python包时必须使用上述命令的情况,我有点困惑。我试图根据这个问题的答案下载一个名为 pyudev 的包。我执行了这个命令:

sudo pip install python-pyudev
Run Code Online (Sandbox Code Playgroud)

但收到以下消息:

Downloading/unpacking python-pyudev

  Could not find any downloads that satisfy the requirement python-pyudev
Cleaning up...
No distributions at all found for python-pyudev
Storing complete log in /home/vineet/.pip/pip.log
Run Code Online (Sandbox Code Playgroud)

但是以下工作正常:

sudo apt-get install python-pyudev
Run Code Online (Sandbox Code Playgroud)

什么时候apt-get应该用于安装包,什么时候python-pip使用?

Adi*_*tya 117

PyPI是 Python 包索引——python模块的存储库。

pip用于直接从 PyPI 下载和安装软件包。PyPI 由Python 软件基金会托管。它是一个专门的包管理器,只处理 python 包。

apt-get 用于从 Canonical 托管的 Ubuntu 存储库下载和安装软件包。

apt-get和安装 python 包的一些区别pip如下:

  • Canonical 只为选定的 python 模块提供包。而 PyPI 承载范围更广的 Python 模块。因此,有很多 Python 模块您将无法使用apt-get.

  • Canonical 只托管任何软件包的单一版本(通常是最新的或最近发布的)。因此,apt-get我们无法决定我们想要的 python-package 版本。pip在这种情况下帮助我们。我们可以安装之前在 PyPI 上上传的任何版本的包。这在依赖项冲突的情况下非常有用。

  • apt-get在系统范围的位置安装 python 模块。我们不能只在我们的项目virtualenv 中安装模块。pip为我们解决了这个问题。如果我们pip在激活virtualenv后使用,那么智能只安装我们项目virtualenv中的模块。如前所述,如果在系统范围的位置已经安装了特定python包的版本,并且我们的一个项目需要同一个python包的旧版本,在这种情况下,我们可以使用virtualenv和pip来安装没有任何冲突的旧版本 python 包。

  • 正如@Radu R?deanu在这个答案中指出的那样,包的名称通常也会有所不同。Canonical 通常将 Python 2 包命名python-<package_name>python3-<package_name>. 而pip我们通常只需要同时<package_name>用于 Python 2 和 Python3 包。

你应该使用哪一个:

这两个apt-getpip成熟,其在安装自动安装任何其他包的依赖包管理器。您可以随意使用任何人。但是,如果您需要安装特定版本的 python-package,或者在 virtualenv 中安装该包,或者安装仅托管在 PyPI 上的包;只会pip帮你解决这个问题。否则,如果你不介意安装在系统级位置的包它并没有真正无论使用apt-get还是pip

  • 此外,您应该尝试使用*一个或另一个*,而不是同时使用`pip`和`apt-get`。 (6认同)
  • 迟早,人们可能需要“apt-get”不提供的软件包或其版本。因为同时使用 `apt-get` 和 `pip` 可能会导致冲突,建议是否应该始终对 `pip` 支持的包使用 `pip`? (4认同)
  • 在全局上下文中使用 pip 是完全错误的,不能使用,因为它会搞乱系统 python 安装。pip 和 apt-get 是完全不同的东西,将它们进行比较是错误的。尝试安装一个依赖于其他非 python 库的 python 模块,你会很快意识到为什么你可能需要 apt-get。 (3认同)
  • @Abhishek,我的首选方法是始终通过 virtualenv 使用 Python .. 所以,是的,我更喜欢使用 pip 而不是 apt .. (2认同)

Rad*_*anu 22

正如@AvinashRaj 在他的评论中所说,pip仅用于安装 python 包,但apt-get用于安装以任何编程语言创建的包。

您的主要问题是在两种情况下都找到正确的包名称:

pip search pyudev
Run Code Online (Sandbox Code Playgroud)

将为您提供要使用安装的软件包的正确名称pip install,如

apt-cache search pyudev
Run Code Online (Sandbox Code Playgroud)

将为您要安装的软件包提供正确的名称apt-get install

radu@Radu: ~ $ pip search pyudev
pyudev                    - A libudev binding
radu@Radu: ~ $ apt-cache search pyudev
python-pyudev - Python bindings for libudev
python3-pyudev - Python3 bindings for libudev
Run Code Online (Sandbox Code Playgroud)

所以,总而言之, 的通讯者sudo apt-get install python-pyudevsudo pip install pyudev,不是sudo pip install python-pyudev

现在取决于您要安装 python 包时要选择的内容:pipapt-get. 例如,请参阅有关使用和安装软件包的差异的问答pipapt-get


Pie*_*erz 8

这是针对GitHub pip 网站上一个广泛链接的问题给出的建议,主题是系统安装的 pip本地安装的 pip

  1. 仅使用系统包管理器来升级系统 pip。系统安装的 pip 属于发行版,如果不使用发行版提供的工具来管理它,就会遇到问题。是的,我们知道 pip 说“您应该使用 pip install -U pip 进行升级” - 在 pip 管理的安装中确实如此,理想情况下发行版应该修补此消息以在系统 pip 中提供适当的指令,但他们没有。我们正在与他们合作解决这个问题,但这不会很快发生(请记住,我们正在研究人们在这里升级旧版本 pip 的情况,因此新版本的补丁不会有帮助)。

  2. 切勿将 sudo 与 pip 一起使用。这是从第一点开始的。如果您认为需要使用 sudo,那么您可能正在尝试修改发行版拥有的文件。参见第 1 点。

  3. 更喜欢使用 --user。通过这样做,您只在个人目录中安装软件包,因此可以避免干扰 pip 的系统副本。但这里您需要注意一些 PATH 问题。我们稍后会介绍这些。简而言之,遵循这个建议,但仍然会遇到问题,因为您实际上并没有运行以 --user 身份安装的包装器。


mes*_*tia 6

我的首选方法是始终使用apt并且仅在 Debian/Ubuntu 存储库中尚未提供该模块的情况下使用pip,但仅在用户上下文中使用 ---user标志。无论如何,使用pip一个都必须从 Ubuntu 的存储库安装所有构建依赖项,或者自己提供它们,这可能是一项乏味的任务。apt-get下载后构建二进制包时安装pip它们。人们不应该使用 pip 将模块安装到系统位置。这是完全错误的。始终使用--user标志将模块安装到主位置。正确配置 PYTHONPATH 让 python 首先从 HOME 获取模块,然后再使用apt-get.