Vagrant配置Pyenv后第二阶段脚本无法识别pyenv命令求助
问题:Vagrant Provision脚本中Pyenv命令找不到,手动SSH后可正常使用
问题描述
使用Vagrant创建Ubuntu虚拟机,通过两个Shell脚本配置Pyenv:
- 第一个脚本
one.sh完成Pyenv安装,并将环境变量配置写入~/.bashrc - 第二个脚本
two.sh执行pyenv相关命令时,提示pyenv: command not found - 但通过
vagrant ssh手动登录虚拟机后,pyenv命令可正常执行 - 尝试为第一个脚本设置
reset和reboot选项,问题仍未解决
相关配置文件
Vagrantfile
Vagrant.configure("2") do |config| config.vm.box = "hashicorp/bionic64" config.vm.synced_folder ".", "/vagrant", disabled: true config.vm.provision "shell", path: "one.sh", privileged: false config.vm.provision "shell", path: "two.sh", privileged: false end
one.sh
#!/bin/bash # Install PyEnv curl https://pyenv.run | bash echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc echo 'eval "$(pyenv init -)"' >> ~/.bashrc exec "$SHELL"
two.sh
#!/bin/bash # install python build deps sudo apt update && sudo apt install -y make build-essential libssl-dev zlib1g-dev \ libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \ libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl git pyenv install 3.10 ten=$(pyenv latest 3.10) pyenv global $ten # Install Poetry curl -sSL https://install.python-poetry.org | python3.10 - export PATH="/home/vagrant/.local/bin:$PATH" # Install Nox python3.10 -m pip install --user --upgrade nox
执行命令:vagrant up --provider=hyperv
原因分析
Vagrant的Shell Provision脚本默认以非交互式Bash会话执行,而~/.bashrc仅在交互式Shell会话中才会自动加载。第一个脚本里的exec "$SHELL"仅能让当前脚本会话加载Pyenv配置,第二个脚本是全新的非交互式会话,无法继承该环境变量,因此找不到pyenv命令。
解决方案
在第二个脚本开头手动加载Pyenv的环境变量配置,无需依赖~/.bashrc的自动加载逻辑。修改后的two.sh如下:
#!/bin/bash # 手动加载Pyenv配置,确保非交互式会话能识别pyenv命令 export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)" # install python build deps sudo apt update && sudo apt install -y make build-essential libssl-dev zlib1g-dev \ libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \ libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl git pyenv install 3.10 ten=$(pyenv latest 3.10) pyenv global $ten # Install Poetry curl -sSL https://install.python-poetry.org | python3.10 - export PATH="/home/vagrant/.local/bin:$PATH" # Install Nox python3.10 -m pip install --user --upgrade nox
其他可选方案
- 将两个脚本合并为一个,让Pyenv配置和后续命令在同一个Shell会话中执行
- 将Pyenv配置写入
~/.profile(部分系统的非交互式登录Shell会加载该文件),但不如手动加载配置可靠
内容的提问来源于stack exchange,提问作者PJ Simpo
相关产品推荐
相关产品推荐

