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

时间:2017-01-02 16:08:54

标签: python pip virtualenv

当我尝试使用

安装python包时,在python虚拟环境中的vagrant环境中工作
(venv) vagrant@vagrant-ubuntu-trusty-64:~$ pip install <package_name>

我收到权限错误:

error: could not create '/home/vagrant/venv/lib/python2.7/site-packages/<package_name>': Permission denied

当我使用sudo安装时:

(venv) vagrant@vagrant-ubuntu-trusty-64:~$ sudo pip install <package_name>

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

我可以使用sudo并指定pip的路径在venv中成功安装软件包:

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

但这很复杂。那么如何阻止sudo pip链接到全局python pip?

谢谢

3 个答案:

答案 0 :(得分:3)

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

在您的情况下,您的pip会被引导到它无法写入的venv或 - 在sudo下 - 到root的环境,在那里你不想要它是

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

您也可以使用sudo -E,它会继承主叫用户的环境,因此应保留您的venv。请务必阅读sudo的人工页面,或者在谷歌上搜索可能遇到的所有问题。

答案 1 :(得分:2)

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

经验教训。我不应该在一个venv里面使用sudo。

修正了:

chmod -R 0777 venv_folder_path_here

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

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

/home/username_here/venv/project_name_here/bin/activate
(venv_name) pip install package_name_here

答案 2 :(得分:0)

Daniel在评论中说,您应该修复虚拟环境目录的权限问题。可能是您已经使用sudo在该目录中安装了一些东西。或者你用sudo创建它。哪个不理想。我建议销毁virtualenv然后再与vagrant用户一起创建它。如果您使用的是pyvenv,请确保通过--copies选项。

正如用户27 ...在他们的回答中所说,你用sudo运行的点数可能与你作为流浪者用户运行的点不一样。您始终可以使用which pip检查该内容。

我建议在python虚拟环境中以which python开头。也许您已经激活了错误的虚拟环境,根本与您的流浪者用户无关。