apt-get install vs pip install apt-get install 与 pip install

我对在下载Python包时必须使用上述命令的情况有些困惑。根据这个问题中的答案,我尝试下载一个名为pyudev的包。我执行了以下命令:
sudo pip install python-pyudev

但是收到了以下信息:
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

然而,以下部分运行良好:

sudo apt-get install python-pyudev

什么时候应该使用apt-get来安装软件包,什么时候使用python-pip

2pip只用于安装Python包,而apt-get用于安装任何软件包。 - Avinash Raj
3好的,那为什么Pip不能安装Python-pyudev呢? - Vineet Kaushik
请查看此链接:http://stackoverflow.com/questions/6874527/difference-in-installing-a-package-using-pip-and-apt-get - Avinash Raj
4个回答

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

pip 用于直接从 PyPI 下载和安装软件包。PyPI 由 Python Software Foundation 托管。它是一个专门处理 Python 软件包的软件包管理器。

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

apt-getpip 安装 Python 软件包之间的一些区别如下:

  • Canonical仅提供选定的Python模块的软件包。而PyPI托管了更广泛的Python模块。因此,有很多Python模块是您无法使用apt-get安装的。

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

  • apt-get将Python模块安装在系统范围内位置。我们不能只在我们的项目virtualenv中安装模块。 pip为我们解决了这个问题。如果我们在激活虚拟环境后使用pip,它足够智能,只会在我们的项目虚拟环境中安装模块。如前所述,如果特定Python软件包的某个版本已经安装在系统范围内位置,并且我们的一个项目需要该Python软件包的旧版本,则在这种情况下,我们可以使用virtualenv和pip安装该旧版本的Python软件包,而不会发生任何冲突。

  • 正如@Radu Rădeanu此答案中指出的那样,软件包名称通常也会有所不同。Canonical通常将Python 2软件包命名为python-<package_name>,将Python 3软件包命名为python3-<package_name>。而对于pip,我们通常只需要使用<package_name>来安装Python 2和Python3软件包。

你应该使用哪个:

apt-getpip都是成熟的软件包管理器,在安装过程中会自动安装其他依赖包。你可以根据自己的喜好选择任何一个。然而,如果你需要安装特定版本的Python包,或者在虚拟环境中安装包,或者安装只在PyPI上托管的包;只有pip能够帮助你解决这些问题。否则,如果你不介意将包安装在系统范围内,那么无论你使用apt-get还是pip都没有太大区别。


9另外,你应该尝试使用其中一个,而不是同时使用pipapt-get - earthmeLon
4迟早会有人需要一个apt-get无法提供的软件包或其版本。由于同时使用apt-getpip可能导致冲突,建议总是对于pip支持的软件包使用pip吗? - Abhishek Anand
2@Abhishek,我的首选方法是始终通过虚拟环境使用Python。所以,是的,我更喜欢使用pip而不是apt。 - Aditya
1在某些情况下,这会引发一系列问题。假设您使用sudo pip而没有使用virtualenv安装了大部分软件包,因为大多数项目都需要相同的环境(但比干净的Ubuntu安装提供的环境更广泛)。然后,当您进行系统升级并且Ubuntu决定将Python升级到新版本时(例如从zestyartful - Python 3.5到3.6),所有在/usr中通过pip安装的软件包都会被留下,pip.get_installed_distributions()会产生一个空列表。 - z33k
4在全局上下文中使用pip是完全错误的,不应该使用,因为它会破坏系统Python安装。pip和apt-get是完全不同的东西,将它们进行比较是错误的。尝试安装一个依赖于其他非Python库的Python模块,你很快就会意识到为什么你可能需要apt-get。 - mestia
未来,也许在2021年,Snap会在这些软件包中扮演一个角色吗? - Timo
1@Timo 我不这么认为。有两种情况:a.) 开发其他操作系统平台的开发者可能不会分发一个snap包,而是使用pip命令或apt来提供一个Unix安装脚本。b.) 如果所有Python发行软件都以snap包的形式存在,这可能会导致对snap的依赖。有些人可能不喜欢这一点。最后,我认为你仍然需要意识到这个问题,并分析第三方软件的分发过程。 - Ralf Bielefeld

正如@AvinashRaj在他的评论中所说,pip仅用于安装Python软件包,而apt-get用于安装任何编程语言创建的软件包。
你的主要问题是在两种情况下找到正确的软件包名称:
pip search pyudev

会为您提供使用pip install安装所需软件包的正确名称。
apt-cache search pyudev

会为您提供要使用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

所以,总结一下,sudo apt-get install python-pyudev的对应命令是sudo pip install pyudev,而不是sudo pip install python-pyudev
现在由你决定在安装Python包时使用哪个工具:pip还是apt-get。可以参考这个问答了解使用pipapt-get安装包的区别。

正如@mestia在被接受的答案中所评论的那样,sudo pip install ...很可能会引起问题。 - Mike C

这是在广泛链接的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的包装器。


我的首选方式是始终使用apt,并且只有在Debian/Ubuntu仓库中尚未提供该模块时才使用pip,但仅限于用户环境下的--user标志。使用pip时,无论如何都必须从Ubuntu的仓库中安装所有构建依赖项,或者自己提供它们,这可能是一项繁琐的任务。apt-get安装二进制包,而pip在下载后再进行构建。不应该使用pip将模块安装到系统位置。这是完全错误的。始终使用--user标志将模块安装到主目录位置。正确配置的PYTHONPATH可以让Python首先从主目录中获取模块,然后再获取通过apt-get安装的系统模块。