如何在使用virtualenv时避免出现“Permission denied”错误

112

我尝试在Ubuntu机器上的虚拟环境中使用pip部署Python包,但遇到了一个与权限有关的问题。例如:

(TestVirtualEnv)test@testServer:~$ pip install markdown2

终止于:

错误:无法创建'/home/test/virtualenvs/TestVirtualEnv/lib/python3.3/site-packages/markdown2.py':权限被拒绝

我不能使用sudo,因为它会全局安装软件包,而不是在虚拟环境内安装。我chownsite-packagesls仅显示与easy_installpipsetuptools相关的目录,与Markdown无关。

如何使用pip在虚拟环境中部署软件包而不遇到与权限有关的错误?


1
只是想澄清一下:您是用 sudo 创建这个 virtualenv 的吗? - sebastian_oe
@sebastian_oe:我相信我做了。我会重新创建一个来确保。 - Arseni Mourzenko
5
可能问题出在这里。尝试不使用 sudo 创建一个虚拟环境。 - sebastian_oe
1
@sebastian_oe:我创建了一个没有使用sudo的虚拟环境。现在,该软件包已经正确安装了。请问您能否将您的评论提升为答案,这样我就可以接受它了吗? - Arseni Mourzenko
1
此外,如果您在不同的用户之间进行切换,请确保使用拥有(或具有写访问权限)virtualenv目录的用户,因为您可以激活其他用户的virtualenv,但它不会让您安装任何包并且会给出许可权限。 - Andrius
显示剩余2条评论
12个回答

141

解决方案:

如果您是以root用户创建的虚拟环境,请运行以下命令:

sudo chown -R your_username:your_username path/to/virtuaelenv/

这可能会解决你的问题。

祝好


1
这对我有用(chown /usr/local/lib/python3.4),除了我不认为我已经以root身份创建了虚拟环境,实际上我是以root身份安装Python3.4的。我仍在测试中,但您认为我会遇到更多问题吗?还是这个chown修复大部分错误? - ntk4
5
如何确定您是否以root创建了virtualenv或python? - A__
这解决了我的问题。我和OP处于类似的情况,需要在 /opt/ 目录下创建虚拟环境,但没有sudo权限无法完成。 - sir_chocolate_soup
1
这个可行。谢谢。 - gilzero

119

virtualenv 的权限问题可能出现在您使用 sudo 创建 virtualenv 后,在不使用 sudo 的情况下操作 virtualenv 时。

正如在您问题的评论中发现的那样,解决方法是不使用 sudo 创建 virtualenv,以便能够在其中工作(特别是写入),而无需使用 sudo


6
如果我想在 /opt 中创建它,需要使用 sudo,我认为 virtualenv 如果没有 sudo 权限将无法安装。 - Umair A.
6
如何在没有使用sudo的情况下创建virtualenv - Tunn
3
如果您是用sudo创建了虚拟环境,请参考@vingtoft的答案,了解如何在不重新创建的情况下轻松修复它。 - David A

9

如果您使用root创建了虚拟环境,请使用此命令

sudo su

这将会给你root权限,然后使用此命令激活你的虚拟环境

source /root/.env/ENV_NAME/bin/activate

2
这个对我解决了在安装requirements.txt(django)中的依赖时出现的权限被拒绝的错误非常有帮助。看起来venv必须从根目录激活。 - Pfinnn

6

当我尝试激活虚拟环境时,我遇到了permission denied的错误提示。我来到这个页面寻找解决方案,希望能够帮助其他遇到类似问题的人。

source your_env_name_goes_here/bin/activate

我使用了错误的命令(没有使用 source )来激活我的环境。如果你使用的是 zsh ,那么这就是正确的命令。如果不是,请参考 Python 文档 上的表格,根据你所用的平台和 shell(Windows 或 Mac、Bash 或 PowerShell 等)选择相应的命令。


6

在我的情况下,我正在使用mkvirtualenv,但没有告诉它我要使用python3。我遇到了这个错误:

mkvirtualenv hug
pip3 install hug -U

....
error: could not create '/usr/lib/python3.4/site-packages': Permission denied

在指定python3后,它就正常工作了:

mkvirtualenv --python=/usr/bin/python3 hug
pip3 install hug -U

5

我没有使用sudo创建我的虚拟环境,因此Sebastian的答案对我不适用。我的项目名叫做utils。我检查了utils目录并看到了这个:

-rw-r--r--   1 macuser  staff   983  6 Jan 15:17 README.md
drwxr-xr-x   6 root     staff   204  6 Jan 14:36 utils.egg-info
-rw-r--r--   1 macuser  staff    31  6 Jan 15:09 requirements.txt

如您所见,utils.egg-info 的所有者是 root 而不是 macuser。这就是为什么它会给我返回 “permission denied” 错误的原因。我还需要删除 /Users/macuser/.virtualenvs/armoury/lib/python2.7/site-packages/utils.egg-link ,因为它也是由 root 创建的。在删除后,我再次执行 pip install -e .,然后它就可以工作了。


1
你在使用pip之前没有激活虚拟环境
尝试使用以下命令:
$(your venv path) . bin/activate

然后在您的主文件夹上使用 pip -r requirements.txt 命令。

1
我也曾经在一个已存在的虚拟环境内创建新的venv时出现过这种情况(不小心)。诊断问题的简单方法是查看python的符号链接所指向的位置,即运行以下命令:
ls -l venv/bin/python

确保它指向适当的Python二进制文件。对于大多数系统,这将是/usr/bin/python/usr/bin/python3。如果它指向现有虚拟环境,则会类似于/home/youruser/somedir/bin/python。如果是后者,我建议在确保您不在任何现有虚拟环境中(即运行deactivate)的情况下重新创建venv。


发布此内容是因为它是一个提及了适当关键词的热门问题,因此更有可能被其他人找到并且对他们有所帮助。 - Sam Mason

0
在CentOS 7上,这个工作了:
首先,创建它
virtualenv --python=/usr/local/bin/python3.8 fastapi

然后激活

source fastapi/bin/activate

0

我也遇到了这个问题。我使用ls -hal检查了我的文件和目录所有权和权限。我拥有这些文件并且它们具有正确的权限。对我来说,问题在于运行pip命令,但是使用的是错误的pip版本。尝试运行which pip查找正在使用的pip版本。从激活的虚拟环境中,运行python3 -m pip install packagename而不是pip install packagename。如果情况变得更糟,您可以运行/path/to/the/pip/you/want/pip install filename


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