![`sudo pip install` 仍然是一种错误的做法吗?](https://linux22.com/image/926678/%60sudo%20pip%20install%60%20%E4%BB%8D%E7%84%B6%E6%98%AF%E4%B8%80%E7%A7%8D%E9%94%99%E8%AF%AF%E7%9A%84%E5%81%9A%E6%B3%95%E5%90%97%EF%BC%9F.png)
我是 Ubuntu 新手,所以请耐心等待。我pip
使用以下命令安装:sudo apt-get -y install python-pip
。然后我安装了神经科学知识库使用他们网站上的命令,即:sudo pip install -U nltk
。但后来我偶然发现这个问题上面说我所做的一切都是“不规范的做法”。最让我印象深刻的是,使用sudo pip
本质上是错误的,pip
用力过猛可能会损坏操作系统文件。有人能证实这一说法吗?
注意-我之所以使用是sudo
因为当我尝试该命令时apt-get -y install python-pip
它给了我2个错误:
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
答案1
sudo pip install
和它的其他常见变体都sudo -H pip install
应该不是不鼓励这样做,因为使用 root 权限pip
从 PyPI(Python 包索引)安装 Python 包存在安全风险。
从https://stackoverflow.com/a/21056000/486919(重点是我的):
当你使用 运行时
pip
,sudo
你setup.py
使用运行sudo
。换句话说,你以 root 身份从互联网运行任意 Python 代码。 如果有人在 PyPI 上发布恶意项目,而你安装了它,你 让攻击者获得您机器的 root 访问权限。在对 PyPI 进行一些最新修复之前pip
,攻击者还可以在您下载可信项目时运行中间人攻击来注入他们的代码。
正如所提到的https://security.stackexchange.com/a/79327/8761,需要注意的是任何人可以将 Python 包(包括恶意包)上传到 PyPI。
简而言之,按照最小特权原则,除非绝对需要,否则不要使用sudo
来从 PyPI 安装 Python 包。相反,请考虑使用(请注意,目前在 Ubuntu 上默认为,没有其他标志/选项)或虚拟环境(例如)。如果您看到有人推荐或,请告诉他们不要这样做。pip
pip install --user
pip install
sudo
pip install --user
virtualenv
sudo pip
sudo -H pip
答案2
您必须使用sudo
安装 pip使用 apt(sudo apt install python-pip
),但正如edwinksl 的回答你不应该使用sudo
安装包使用 pip,你应该使用pip install --user <package>
仅为你的用户安装,或者使用虚拟环境进一步限制该方案的范围。
Apt 从 Ubuntu 的存储库安装软件包,而 pip 从 PyPi 安装用户上传的软件包,这些软件包可能是恶意的。
答案3
以下是一个更为温和的回答:
- 您确实必须一直这样做
sudo apt-get install ...
,这就是该工具的设计工作方式。 - 使用
sudo [-H]
withpip install
是可能的,也是可选的,取决于您到底想做什么(因此,存在“争议”)。
之一Python 的座右铭是“应该有一种——最好只有一种——显而易见的方法来实现这一目标。”和大多数座右铭一样,它似乎在每个可能的机会都会被嘲讽地打破。(我想这就是座右铭存在的原因。)不幸的是,在我看来,Python 生态系统由许多冲突的“硬性”规则,永远不能被打破……除非是“yada yada yada”(魔鬼、细节等)。在几乎所有情况下,这都是由于语言和工具的历史演变(当他们只想继续工作时,谁会想要/需要历史课)——但也可能是由于 Mac/Win/*Nix 平台的差异(例如,Unix/Linux 具有相似的心态,但具有几十年更成熟的优势。)所以请采取所有这些措施“破坏惯例”&“本质上是错误的”货物崇拜者持怀疑态度。有些人确实是好心。(其他人只是,嗯,恶意的。)
首先,与基本的“按用户安装”相比,您几乎总是更喜欢虚拟环境,因为实际上,这很可能就是您最终需要的。所以您最好现在就开始使用它。如何完成这项工作完全取决于“依赖”(参见上面的 Python 座右铭)。如果您使用的是 Conda(主要用于 Mac 和 Windows),它将被设置使用 Conda. 如果使用“纯”Python[原文如此],这取决于你使用的版本和 Python 工具,但是虚拟环境包装器非常方便。
其次,作为“绝不使用 sudo”规则的反例,您可能更喜欢sudo -H pip install -U numpy
,这完全没问题,甚至有优势,因为它可以避免下载/重新安装/维护大型库(您只需要一个版本)到每个虚拟环境中。大型、流行的框架(如 scikit-learn、NumPy、matplotlib、SciPy、pandas 等)可以一次安装完成,跨环境重复使用。此外,您当地的友好系统管理员可能能够安装这些每一个系统上的用户——显然他们也会通过这样做sudo
,例如,对于更复杂的安装,如 TensorFlow。
最后,如果你正在安装一些随机的第三方库,这些库会执行某些操作(Twitter API、文本处理、代码格式化等),那么我完全同意——不要通过 sudo 以 root 身份安装。当然,以当前用户身份安装。但请记住,你的用户帐户中有你所有真正重要的资料。
答案4
补充这些答案:我不了解 Ubuntu,但在 Fedora 上我可以使用sudo dnf install python3-numpy
格式来安装许多对我有用的软件包。这没有不安全的缺点(发行版仓库维护者已经验证了软件包),而且还允许您在系统范围内安装。唯一的缺点是发行版仓库版本可能略微落后于 PyPI 中的软件包。