首页 > 解决方案 > 在 Vagrant 中安装 django-cron 时权限被拒绝

问题描述

运行时pip install django-cron出现以下错误:

ERROR: Error [Errno 13] Permission denied: '/vagrant/.venv/bin/python' while executing command python setup.py egg_info
ERROR: Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/vagrant/.venv/bin/python'
Consider using the `--user` option or check the permissions.

但是,如果我使用--user,我会收到一个不同的错误消息:

ERROR: Can not perform a '--user' install. User site-packages are not visible in this virtualenv.

我的venv已激活。

当我之前尝试安装库时,一切正常,如果我使用 sudo 命令,我会收到以下警告:

WARNING: The directory '/home/vagrant/.cache/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag. 

遗憾的是,使用-H并不能解决问题,我不确定如何更改对 .venv 文件的访问权限,我们将不胜感激。

我只收到 Python 模块django-cron和的此错误,但可以成功安装django-crontab其他模块。pillow

编辑4:我的设置有点笨拙,因为我使用的是Vagrant,但我有PyCharm Community Editon,所以我最终下载了两次包,一次只是为了让编辑器识别它,另一次是我运行程序的Vagrant ,当我在 PyCharm 中执行此操作时,它在 PyCharm 中工作。

这是Vagrantfile我使用的:

Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-18.04"

  config.vm.network "forwarded_port", guest: 8080, host: 8080

  config.vm.provision "shell", inline: <<-SHELL
    sudo apt-get install python3-distutils -y
    curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
    sudo python3 get-pip.py
    rm get-pip.py
    sudo pip install virtualenv
    cd /vagrant 
    virtualenv -p /usr/bin/python3 .venv --always-copy
    echo "cd /vagrant && source /vagrant/.venv/bin/activate" >> /home/vagrant/.profile
  SHELL
end

标签: pythonpython-3.xpipvagrantdjango-cron

解决方案


默认情况下,Vagrant 配置脚本以 root 身份执行。由于您在配置期间创建了虚拟环境,因此目录归 root 所有,普通用户 (vagrant) 无法访问。

要解决此问题,您应该将 shell 配置选项“特权”设置为 false。

更改此行:

config.vm.provision "shell", inline: <<-SHELL

到:

config.vm.provision "shell", privileged: false, inline: <<-SHELL

或者,您可以修改您的配置脚本以virtualenv使用以下命令以 vagrant 用户身份运行该命令:

sudo -u vagrant virtualenv -p /usr/bin/python3 .venv --always-copy

更新:

尽管上述情况通常是正确的,但这不是您的问题的原因,因为您在内部安装了虚拟环境/vagrant,它是主机上目录的虚拟挂载(Vagrantfile存储您的目录)。普通文件权限不适用于此目录,或者至少不是以通常的方式。

无论出于何种原因(可能是一个错误),Python 模块似乎都存在这个挂载的django-cron问题。django-crontab

在 VM 文件系统而不是主机文件系统中创建虚拟环境可以解决该问题。您可以使用以下 Vagrantfile。我对此进行了测试,并且可以毫无错误地安装django-cron

Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-18.04"

  config.vm.network "forwarded_port", guest: 8080, host: 8080

  config.vm.provision "shell", privileged: false, inline: <<-SHELL
    sudo apt-get install python3-distutils -y
    curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
    sudo python3 get-pip.py
    rm get-pip.py
    sudo pip install virtualenv
    virtualenv -p /usr/bin/python3 /home/vagrant/venv --always-copy
    echo "cd /vagrant && source /home/vagrant/venv/bin/activate" >> /home/vagrant/.profile
  SHELL
end

推荐阅读