如何在ssh进入vagrant虚拟机时自动激活Python的venv?

4
在运行Ubuntu 16.04的Vagrant虚拟机中,我使用以下命令创建了一个Python 3虚拟环境:
python3 -m venv /home/vagrant/venv

当我使用vagrant ssh时,我可以使用以下任一方式激活它:
source /home/vagrant/venv/bin/activate

或者

. /home/vagrant/venv/bin/activate

在配置过程中,我正在创建文件/etc/profile.d/login-bash.sh

cd /vagrant
. /home/vagrant/venv/bin/activate

当我使用ssh登录时,该文件正在运行,因为我是从共享目录/vagrant开始的,但第二行似乎没有做任何事情。


当您通过ssh连接到服务器时运行的shell与在配置期间使用的shell不同。您确定venv未被激活吗? - cyber-cap
这就是为什么我正在/etc/profile.d/中创建文件 - 我认为在此目录中的文件会在登录时运行?我知道这个方法可行,因为第一行按预期运行。 - StringsOnFire
如果您已经在使用虚拟机,为什么不跳过虚拟环境,根据需要配置虚拟机的Python安装呢? - chepner
我更喜欢将项目Python与操作系统隔离开来。 - StringsOnFire
你熟悉echo命令吗?在引用之前放置一个echo,在引用之后放置一个echo,在activate脚本中放置一个或两个echo - techraf
显示剩余3条评论
2个回答

3
问题已解决。每次 ssh 登录都会运行 ~/.profile
config.vm.provision "shell", inline: 'echo ". /home/vagrant/venv/bin/activate" > ~/.profile', privileged: false

1
如果您在Vagrantfile中使用下面的代码行,问题将会被解决:
config.vm.provision "shell", inline: 'echo ". /home/vagrant/venv/bin/activate" > ~/.profile', privileged: false

如果您需要激活Python环境并更改目录到/vagrant,请在您的Vagrantfile中使用以下行:
config.vm.provision "shell", inline: 'echo ". /home/vagrant/venv/bin/activate && cd /vagrant" > ~/.profile', privileged: false

最终你的Vagrantfile应该长成这样(再加上你自己的配置):

Vagrant.configure("2") do |config|    
  config.vm.provision "shell", inline: 'echo ". /home/vagrant/venv/bin/activate && cd /vagrant" > ~/.profile', privileged: false
end

在修改了 Vagrantfile 后,不要忘记在终端中运行 vagrant up --provision 以使更改生效。


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