apt-get安装vs pip安装


103

对于下载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?什么时候应该使用?


2
pip仅用于安装python软件包,但apt-get用于安装所有any软件包。
Avinash Raj 2014年

3
好的..那为什么pip无法安装python-pyudev?
Vineet Kaushik 2014年

Answers:


100

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

pip用于直接从PyPI下载和安装软件包。PyPI由Python Software Foundation托管。这是一个专门的软件包管理器,仅处理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包没有任何冲突。

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

您应该使用哪一个:

这两个apt-getpip成熟包管理器,其在安装自动安装任何其他软件包的依赖。您可以随便使用任何人。但是,如果您需要安装特定版本的python-package或将其安装在virtualenv中,或者安装仅在PyPI上托管的软件包;只会pip帮助您解决该问题。否则,如果您不介意在系统范围内安装软件包,则使用apt-get还是都没有关系pip


5
此外,你应该尝试使用一个或另一个,而不是两个pipapt-getsimutaneously。
EarthmeLon,2016年

3
迟早,可能需要的软件包或版本未提供apt-get。因为同时使用apt-getpip可能会引起冲突,因此建议始终使用pip受支持的软件包pip吗?
Abhishek Anand

2
@Abhishek,我的首选方法是始终通过virtualenv使用Python。所以,是的,我更喜欢使用pip而不是apt ..
Aditya 2016年

在某些情况下,这会打开自己的蠕虫罐。假设您安装了大多数软件包而sudo pip没有安装软件包,virtualenv因为大多数项目都需要相同的环境(但比干净的Ubuntu安装所提供的环境更广泛)。然后,当您进行系统升级时,Ubuntu决定将Python升级到新版本(例如,zestyartfulPython 3.5升级到3.6),所有安装在pip中的软件包/usr都被抛在了后面,并pip.get_installed_distributions()生成一个空列表。
z33k

在全局上下文中使用pip是绝对错误的,并且不能使用,因为它会弄乱系统python的安装。pip和apt-apt会获得完全不同的东西,将它们进行比较是错误的。尝试安装依赖于其他非python库的python模块,您将很快意识到为什么可能需要apt-get。
mestia

21

就像@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-pyudevis 的对应者sudo pip install pyudev不是sudo pip install python-pyudev

现在取决于您要安装python软件包时要选择的内容:pipapt-get。例如,请参阅此问答,以了解使用pip和安装软件包的区别apt-get


2

我的首选方式是始终使用,apt并且仅当模块在Debian / Ubuntu存储库中尚不可用时使用pip,而仅在用户上下文- --user标志中使用。pip无论如何,通过使用一个工具,必须从Ubuntu的存储库中安装所有构建依赖项,或者自己提供它们,这可能是一项繁琐的任务。apt-get安装二进制软件包,pip然后在下载后构建它们。一个人不应该使用pip将模块安装到系统位置。这是完全错误的。始终使用--user标志将模块安装到家庭位置。正确配置的PYTHONPATH允许python首先从HOME拾取模块,然后从安装系统模块apt-get

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.