在虚拟环境中,"sudo pip"链接到全局python pip

Tho*_*ins 8 python pip virtualenv

当我尝试使用python包安装python包时,在python虚拟环境中的vagrant环境中工作

(venv) vagrant@vagrant-ubuntu-trusty-64:~$ pip install <package_name>
Run Code Online (Sandbox Code Playgroud)

我收到权限错误:

error: could not create '/home/vagrant/venv/lib/python2.7/site-packages/<package_name>': Permission denied
Run Code Online (Sandbox Code Playgroud)

当我使用sudo安装时:

(venv) vagrant@vagrant-ubuntu-trusty-64:~$ sudo pip install <package_name>
Run Code Online (Sandbox Code Playgroud)

安装成功,但是包没有安装在venv中,而是安装在全局python目录中.

我可以通过使用sudo和指定pip的路径在venv中成功安装包:

(venv) vagrant@vagrant-ubuntu-trusty-64:~$ sudo /home/vagrant/venv/bin/pip install <package_name>
Run Code Online (Sandbox Code Playgroud)

但这很复杂.那么如何才能停止sudo pip链接到全局python pip?

谢谢

use*_*968 5

根本问题是sudo默认情况下不会在执行命令时继承用户的环境。这就是你想要的——相信我。

在您的情况下,您pip要么被引导到它无法写入的 venv,要么 - 在 sudo 下 - 引导到您不希望它成为的 root 环境。

您发布的解决方案实际上是有效的:如果您使用 sudo,请务必准确地告诉它要做什么、如何做以及向谁做!上述所有内容都可以由用户的环境变量控制,因此谨慎是关键。

您也可以使用sudo -E,它确实继承了调用用户的环境,因此应该保留您的 venv。不过,请务必阅读sudo的手册页或在谷歌上搜索所有可能遇到的麻烦。


jtu*_*uri 5

我在 pip vs sudo pip 和 virtualenv pip vs local pip 上遇到了同样的问题。几个月前我创建我的 venv 时,我以 root 用户身份登录。所以当我想安装一个新的 pip 包时,权限被拒绝。所以用 sudo 尝试了相同的命令,但是它在我的本地 pip 上安装了这个包。

学过的知识。我不应该在 venv 中使用 sudo。

修复它:

chmod -R 0777 venv_folder_path_here
Run Code Online (Sandbox Code Playgroud)

-R 开关用于在 venv 文件夹中进行递归更改。

然后激活您的 venv 并尝试 pip install:

/home/username_here/venv/project_name_here/bin/activate
(venv_name) pip install package_name_here
Run Code Online (Sandbox Code Playgroud)