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 和local/ 之间的空格了吗?您刚刚开始删除整个 /usr 文件夹,其中包含系统上大部分重要文件和程序。希望你有备份!现在,这并不意味着您需要对sudo 感到害怕,但您确实需要对它怀有健康的尊重。
Python 安装往往是系统级的(是的,我知道有例外),这意味着您需要使用 sudo 来修改它们,例如使用 pip 安装 3rd-party 模块时。如果你跑
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 层次结构,并将所有已安装的模块连同脚本一起存储在 ~/bin 中(您应该添加到您的$PATH。此方法的优点是您不需要使用sudo,因此您不会意外覆盖其他需要特定版本的系统相关模块程序运行。缺点是安装的模块只对您可用,因此您可能遇到问题,例如,如果您的 Web 服务器试图以自身身份运行 Flask,但不能读取源文件。但是,这不是一点配置文件编辑无法解决的问题。这是我为大多数用户推荐的解决方案。
第三种选择是使用像virtualenv 这样的虚拟环境。这将在您选择的位置创建一个自定义 Python 安装,具有 单独 python 可执行文件和 site-packages 层次结构(您可以选择是否要链接到或使用系统的dist-packages 存储库)。您可以将pip install 直接打包到virtualenv 中,并根据您的小心脏的需要创建尽可能多的环境,例如,每个环境的各种依赖项的版本都略有不同,这样您就可以更健壮地测试您的程序。您可以打开和关闭虚拟环境,例如,您可以在终端的不同选项卡中运行几个,例如并行测试。这是我的第二名建议,因为激活和使用环境涉及(稍微)更多的工作,如果你不擅长命名它们,你可能会对你在哪个环境工作感到困惑。缺点包括缺乏系统范围的可用性,如第二个选项,以及虚拟环境需要在使用前手动激活。
因此,请查看选项,看看哪些选项最适合您的系统和您的特定情况。祝你好运!