当我尝试使用
安装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?
谢谢
答案 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
开头。也许您已经激活了错误的虚拟环境,根本与您的流浪者用户无关。