apt-get install vs 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
?
PyPI是Python Package索引 – python模块的存储库。
pip
用于直接从PyPI下载和安装软件包。 PyPI由Python Software Foundation托管。 它是一个专门的包管理器,只处理python包。
apt-get
用于从Canonical托管的Ubuntu存储库下载和安装软件包。
从apt-get
和pip
安装python包之间的一些区别如下:
-
Canonical仅为选定的python模块提供包。 然而,PyPI拥有更广泛的python模块。 所以,有很多python模块,你将无法使用
apt-get
安装。 -
Canonical仅托管任何软件包的单个版本(通常是最新版本或最近发布的版本)。 所以,使用
apt-get
我们无法决定我们想要的python-package的版本。pip
在这种情况下帮助我们。 我们可以安装以前在PyPI上传的任何版本的软件包。 这在依赖项冲突的情况下非常有用。 -
apt-get
在系统范围内安装python模块。 我们不能只在我们的项目virtualenv中安装模块。pip
为我们解决了这个问题。 如果我们在激活virtualenv后使用pip
,它足够智能,只能在我们的项目virtualenv中安装模块。 如前所述,如果某个特定python包的版本已安装在系统范围的位置,并且我们的一个项目需要相同python包的旧版本,在这种情况下我们可以使用virtualenv和pip来安装那个旧版本的python包没有任何冲突。 -
正如@RaduRădeanu 在这个答案中指出的那样,包的名称通常也会有所不同。 Canonical通常将Python 2包命名为
python-
,将Python 3包python3-
为python3-
。 而对于pip
我们通常只需要对Python 2和Python3包使用
。
你应该使用哪一个:
apt-get
和pip
都是成熟的包管理器,可以在安装时自动安装任何其他包依赖项。 您可以随意使用任何人。 但是,如果您需要安装特定版本的python-package,或者在virtualenv中安装该软件包,或者安装仅在PyPI上托管的软件包; 只有pip
可以帮助你解决这个问题。 否则,如果您不介意在系统范围内安装软件包,那么使用apt-get
或pip
并不重要。
正如@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
。 例如,请参阅此问答,了解使用pip
和apt-get
安装软件包的不同之处。
我首选的方法是始终使用apt
并且只有在Debian / Ubuntu存储库中尚未提供模块才能使用pip
,但仅限于用户上下文 – --user
flag。 通过使用pip
无论如何必须从让我们说Ubuntu的存储库中安装所有构建依赖项,或者自己提供它们,这可能是一项繁琐的任务。 apt-get
安装二进制包,而pip
在下载后构建它们。 不应该使用pip将模块安装到系统位置。 这是完全错误的。 始终使用--user
标志将模块安装到主位置。 正确配置PYTHONPATH让python首先从HOME apt-get
模块,然后使用apt-get
安装系统模块。