为什么我在使用Python和pip时不能不使用sudo做某些事情?

9 投票
2 回答
10499 浏览
提问于 2025-05-11 02:47

我在用pip的时候,通常需要加上sudo才行。我经常看到别人用pip的时候不加sudo,那我是不是哪里做错了?

我听说用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来安装flask的时候:

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

相关文章:

  • 暂无相关问题
暂无标签

2 个回答

10

原因是你的普通用户没有权限去修改系统目录。就像下面这条信息所说的:

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

这里有一些你需要知道的要点:

你的系统上已经安装了python,如果想要修改系统的python,你必须使用sudo命令或者以root用户身份登录。

你可以在自己的家目录里安装python库,而不需要使用sudo,但只有你自己(而不是系统上的其他用户)能使用这些库。可以用 pip install --user package-name 这个命令来安装,就像gongzhitaao提到的那样。

你还可以在你选择的目录中创建独立的python安装,就像The Laughing Man提到的。这种方式叫做virtualenv,我认为这是最推荐的工作方式。

8

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*

之间的空格你看到了吗?你刚刚开始删除整个 /usr 文件夹,而这个文件夹里包含了系统中大量重要的文件和程序。希望你有备份!不过,这并不是说你要对 sudo 感到恐惧,但你确实需要对它保持应有的尊重

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

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

你会看到类似于

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

的信息,显示你尝试安装的目录是属于 root 的,所以需要使用 sudo

现在,有几种方法可以解决这个问题。如果你觉得没问题,并且不介意修改系统的全局包,可以继续使用 sudopip(实际上,如果你在开始时看到关于你主目录权限的黄色小消息,你可能需要使用 sudo -H ...)。所有的模块会被安装到 /usr/local/lib/python3.4/dist-packages,并且对系统上的所有用户可用。

第二个选择是使用 pip--user 选项,这样会在你的主目录(~)中创建一个 lib/python3.4/site-packages 的结构,并把安装的模块存放在那里,同时脚本会放在 ~/bin 中(你应该把它添加到你的 $PATH 中)。这个方法的好处是你不需要使用 sudo,这样就不会意外覆盖系统依赖的模块,因为其他程序可能需要特定版本才能运行。缺点是安装的模块只对你自己可用,所以如果比如说你的网络服务器试图以自己的身份运行 Flask,却无法读取源文件,可能会遇到问题。不过,这些问题通过稍微修改配置文件就能解决。这是我推荐大多数用户的解决方案。

第三个选择是使用像 virtualenv 这样的虚拟环境。这会在你选择的位置创建一个自定义的 Python 安装,拥有一个独立python 可执行文件和 site-packages 结构(你可以选择是否链接到系统的 dist-packages 仓库)。你可以直接在虚拟环境中 pip install 包,并根据需要创建多个环境,每个环境可以有不同版本的依赖,这样你就可以更全面地测试你的程序。你可以随时开启和关闭虚拟环境,比如你可以在终端的不同标签页中同时运行几个,进行并行测试。这是我推荐的第二个选择,因为激活和使用这些环境需要稍微多一点工作,如果你不善于命名,可能会搞混你正在使用的是哪个环境。缺点包括像第二个选项一样缺乏系统范围的可用性,以及虚拟环境需要在使用前手动激活。

所以,看看这些选项,看看哪个最适合你的系统和具体情况。祝你好运!

撰写回答