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

11
在一个Python虚拟环境里的Vagrant环境中,当我尝试使用命令安装Python包时:
(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>

安装成功,但软件包未安装在虚拟环境内,而是安装在全局 Python 目录中。

我可以通过使用sudo并指定 pip 路径来在虚拟环境内成功安装软件包:

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

这很复杂。那么我如何阻止sudo pip链接到全局的 Python pip?

谢谢你。


1
你是怎么设置虚拟环境的? - Harald Nordgren
4
不应该试图阻止sudo执行其应执行的操作;你应该修复原始的权限问题。 - Daniel Roseman
3个回答

7

我曾遇到pip与sudo pip以及venv pip与本地pip的相同问题。

几个月前,我作为root用户登录时创建了我的venv。当我想安装新的pip包时,遇到了权限被拒绝的问题。于是我尝试使用sudo命令,但这样却将包安装在了我的本地pip上。

从中得到的教训是,在venv中不应该使用sudo命令。

以下是解决方法:

chmod -R 0777 venv_folder_path_here

使用-R开关对venv文件夹进行递归更改。

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

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

5
根本问题在于sudo执行命令时默认不会继承用户的环境。这正是您想要的-相信我。

在您的情况下,您的pip可能被引导到它无法写入的虚拟环境中,或者在sudo下被引导到root的环境中,而您不希望它在那里。

您发布的解决方案实际上是有效的:如果使用sudo,请确保明确告诉它要做什么、如何做以及对谁进行操作!所有这些都可以通过用户的环境变量来控制,因此请谨慎。

您还可以使用sudo -E,它会继承调用用户的环境,因此应该会保留您的虚拟环境。但务必阅读sudo的手册或搜索一下可能遇到的所有问题。


1

正如Daniel在评论中所说,您应该解决虚拟环境目录的权限问题。可能是您已经使用sudo在该目录中安装了某些内容。或者您使用sudo创建了它。这不是理想的情况。我建议销毁virtualenv,然后使用vagrant用户再次创建它。如果您使用pyvenv,请确保传递--copies选项。

正如user27在他们的答案中所说,您使用sudo运行的pip可能与您作为vagrant用户运行的pip不同。您可以始终使用which pip检查。

我建议从python虚拟环境内部开始使用which python。也许您已经激活了错误的虚拟环境,与您的vagrant用户无关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接