在 Vagrant 中安装 django-cron 时权限被拒绝

Permission denied while installing django-cron in Vagrant

当 运行ning 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-crondjango-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

当您没有 /vagrant/.venv 文件夹的写入权限时,通常会发生这种情况。您可以使用 ls -l cmd.

检查访问权限

如果是这样,您应该更改对 /vagrant/.venv 文件夹的访问权限。

直接在cmd中使用pip命令试试

pip install <packagename>

默认情况下,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-crondjango-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