为什么我在使用Python和pip时不能不使用sudo做某些事情?
我在用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 个回答
原因是你的普通用户没有权限去修改系统目录。就像下面这条信息所说的:
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,我认为这是最推荐的工作方式。
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
。
现在,有几种方法可以解决这个问题。如果你觉得没问题,并且不介意修改系统的全局包,可以继续使用 sudo
和 pip
(实际上,如果你在开始时看到关于你主目录权限的黄色小消息,你可能需要使用 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
包,并根据需要创建多个环境,每个环境可以有不同版本的依赖,这样你就可以更全面地测试你的程序。你可以随时开启和关闭虚拟环境,比如你可以在终端的不同标签页中同时运行几个,进行并行测试。这是我推荐的第二个选择,因为激活和使用这些环境需要稍微多一点工作,如果你不善于命名,可能会搞混你正在使用的是哪个环境。缺点包括像第二个选项一样缺乏系统范围的可用性,以及虚拟环境需要在使用前手动激活。
所以,看看这些选项,看看哪个最适合你的系统和具体情况。祝你好运!