如何在bash脚本中激活pyenv创建的virtualenv虚拟环境
问题根因
直接执行bash脚本时,启动的是非交互式非登录shell,这类shell默认不会加载~/.bashrc配置文件。你手动逐行执行时用的是当前登录的交互式shell,已经加载过pyenv的初始化配置,所以可以正常运行,脚本里的子shell没加载到配置,自然识别不到pyenv activate的虚拟环境相关功能。
可行解决方案
- 方案1:脚本内直接初始化pyenv(最通用,不依赖外部配置)
直接在你的启动脚本的shebang行之后,添加pyenv初始化代码即可,示例脚本如下:
#!/bin/bash # 脚本内手动初始化pyenv环境 export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" # 后续执行原有启动逻辑 pyenv activate .ve pyenv exec gunicorn config.wsgi:application --name mini2 --workers 8 \ --bind=unix:/tmp/run/mini2.socket \ --log-level=debug --log-file=-
- 方案2:直接调用虚拟环境内的二进制文件(生产环境最推荐,无需激活逻辑)
不需要走pyenv activate流程,直接调用目标虚拟环境下的gunicorn可执行文件即可,稳定性更高。
首先在交互式shell中执行以下命令拿到gunicorn的完整路径:pyenv activate .ve && pyenv which gunicorn
假设输出路径为/home/mini2/.pyenv/versions/.ve/bin/gunicorn,直接在脚本内用该路径启动即可,脚本可以简化为:
#!/bin/bash /home/mini2/.pyenv/versions/.ve/bin/gunicorn config.wsgi:application --name mini2 --workers 8 \ --bind=unix:/tmp/run/mini2.socket \ --log-level=debug --log-file=-
该方案完全不依赖pyenv的初始化、shell环境变量配置,适配所有运行场景,包括systemd、crontab等调用场景。
- 方案3:以交互式模式运行脚本(仅适合临时测试,不推荐生产使用)
执行脚本时添加-i参数强制以交互式shell运行,会自动加载.bashrc配置:bash -i ./production.sh
注意:你原有的gunicorn启动参数重复写了两次
--workers 8,可以删掉冗余的一条。
内容的提问来源于stack exchange,提问作者Eric Chang
相关产品推荐
相关产品推荐

