为什么我不用sudo使用Python和pip做一些事情?

时间:2015-11-25 16:57:20

标签: python pip virtualenv sudo

当我使用pip时,通常没有sudo就无法工作。我经常看到人们使用没有sudo的pip,所以我做错了什么?

我读过不建议用sudo安装pip包。我知道使用virtualenv我可以使用不带sudo的pip,但要安装virtualenv我必须首先使用sudo。

当我尝试在没有sudo的情况下安装pip时,我得到:

PermissionError: [Errno 13] Permission denied: '/usr/local/lib/python3.4/dist-packages/pip'

尝试使用pip3 install flask安装烧瓶时:

PermissionError: [Errno 13] Permission denied: '/usr/local/lib/python3.4/dist-packages/werkzeug'

2 个答案:

答案 0 :(得分:10)

原因是您的普通用户没有修改系统目录所需的权限。就像在这条消息中一样:

PermissionError: [Errno 13] Permission denied: '/usr/local/lib/python3.4/dist-packages/pip'

以下简要介绍了您需要了解的内容:

你的系统安装了python,为了修改系统的python,你必须使用sudo或者是root用户。

您可以在不使用sudo的情况下在主目录中安装python库,但只有您(不是系统的其他用户)才能使用它。用{jongzhitaao提到的pip install --user package-name来做这件事。

您还可以在您选择的目录中创建独特的python安装,例如The Laughing Man提到的。这被称为virtualenv,我认为这是最受欢迎的工作方式。

答案 1 :(得分:7)

sudo在Unix / Linux系统中用于以另一个用户身份执行任务,使用他们的权限,例如写入某些目录的能力。如果未指定要模拟的用户,例如运行时

sudo pip install flask

您正在尝试以系统管理员身份运行该命令,在许多环境中称为root。系统会要求您输入管理员密码(如果您已授予用户管理员权限,则可以是您自己的密码),然后指定的命令将作为该用户运行,这意味着它具有读/写权限基本上访问系统上的每个文件和目录(有一些例外,但它们主要是极端情况,在这里不是很重要)。这意味着在使用sudo时需要非常小心,因为像单个空格一样小的错误可能会让事情变得更糟:比较

sudo rm -rf /usr/local/lib/python3.4/dist-packages/numpy*

sudo rm -rf /usr /local/lib/python3.4/dist-packages/numpy*

查看/usrlocal/之间的空格?您刚开始删除整个/usr文件夹,其中包含系统中的大部分重要文件和程序。希望你有备份!现在,这并不意味着你需要被sudo吓死,但你需要对它有一个健康的尊重。

Python安装往往是系统级的(是的,我知道有例外),这意味着您需要使用sudo来修改它们,例如在使用pip安装第三方模块时。如果你运行

ls -l /usr/local/lib/python3.4 

你会看到

的内容
drwxrwsr-x 125 root 4096 Nov  3 00:40 dist-packages

显示您尝试使用pip安装到的目录由root拥有,因此必须使用sudo

现在,有几种方法可以解决这个问题。如果您对此感到满意,并且不介意修改系统的全局包,请继续使用sudo pip(事实上,如果您使用sudo -H ...在开头有一个关于主目录中权限的黄色小消息)。您的所有模块都将安装到/usr/local/lib/python3.4/dist-packages,并可供系统上的所有用户使用。

第二个选项是使用pip的--user选项,它将在您的主目录(lib/python3.4/site-packages)中创建~层次结构,并在其中存储所有已安装的模块,以及{ {1}}(您应该将其添加到~/bin。此方法的优点是您需要使用$PATH,因此您不会意外覆盖系统相关模块,其中运行其他程序需要特定版本。缺点是已安装的模块仅供您使用,因此可能会遇到问题,例如,如果您的Web服务器我试图将Flask作为自己运行,并且无法读取源文件。但是,这不是一个小配置文件编辑无法解决的问题。这是我推荐的大多数用户的解决方案。

第三种选择是使用virtualenv之类的虚拟环境。这将在您选择的位置创建自定义Python安装,使用单独的 sudo可执行文件和python层次结构(有关于是否要链接的选项)或使用系统的site-packages存储库)。您可以dist-packages直接打包到virtualenv中,并根据您的小心愿创建尽可能多的环境,每个环境都有不同版本的各种依赖项,例如,这样您就可以更加健壮地测试您的程序。您可以打开和关闭虚拟环境,例如,您可以在终端的不同选项卡中运行一对,例如,并行测试事物。这是我的第二位推荐,因为在激活和使用环境方面涉及(稍微)更多的工作,如果你不是很擅长命名,你可能会对你正在做的工作感到困惑。缺点包括缺乏系统范围的可用性,如第二个选项,以及虚拟环境需要在使用前手动激活的事实。

因此,请查看选项,看看哪种选择最适合您的系统和您的特定情况。祝你好运!