如何在bash脚本中激活pyenv创建的virtualenv?

Eri*_*ang 5 python bash pyenv

我需要编写一个脚本来启动使用 pyenv 开发的gunicorn + django 站点,该脚本类似于

#!/bin/bash
                                                                                
pyenv activate .ve
pyenv exec gunicorn config.wsgi:application --name mini2 --workers 8 \
--workers 8 --bind=unix:/tmp/run/mini2.socket \
--log-level=debug --log-file=-
Run Code Online (Sandbox Code Playgroud)

和错误消息

2021-12-06 14:09:00 [mini2@s017 mini2]$ ./prodution.sh 

Failed to activate virtualenv.

Perhaps pyenv-virtualenv has not been loaded into your shell properly.
Please restart current shell and try again.

2021-12-06 14:09:55 [mini2@s017 mini2]$ 
Run Code Online (Sandbox Code Playgroud)

我可以逐行运行脚本。所以脚本中肯定有问题,但我不知道出了什么问题。

我已经在 bashrc 中附加了几行关于 pyenv 的内容

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
 eval "$(pyenv init -)"
fi
Run Code Online (Sandbox Code Playgroud)

那么有没有办法在bash脚本中激活pyenv创建的virtualenv?有什么建议 ??

更新:

根据Failed to activate virtualenv with pyenv

我更新我的 .bashrc

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
#if command -v pyenv 1>/dev/null 2>&1; then
# eval "$(pyenv init -)"
#fi
Run Code Online (Sandbox Code Playgroud)

但仍然不工作。

my test script
#!/bin/bash

pyenv activate .ve

and the error 

Failed to activate virtualenv.

Perhaps pyenv-virtualenv has not been loaded into your shell properly.
Please restart current shell and try again.
Run Code Online (Sandbox Code Playgroud)

Dan*_*l F 5

而不是使用

${PYENV_ROOT}/versions/<venv name>/bin/python script.py
Run Code Online (Sandbox Code Playgroud)

正如其他答案中所建议的,您可以“手动”激活环境:

. ${PYENV_ROOT}/versions/<venv name>/bin/activate
python script.py
Run Code Online (Sandbox Code Playgroud)

请注意,前面的${PYENV_ROOT}等于source命令。

这样做的好处是保留python script.py为命令行而不是/home/<user>/<pyenv root>/versions/<venv name>/bin/python script.py,这可能会有所帮助htop

这意味着替换

pyenv activate .ve
Run Code Online (Sandbox Code Playgroud)

. ${PYENV_ROOT}/versions/.ve/bin/activate
Run Code Online (Sandbox Code Playgroud)

可以解决您的问题,前提是这.ve是虚拟环境的名称。


sci*_*ase 2

您的脚本中不需要pyenv activate虚拟环境。由于虚拟环境的工作方式[1],您只需使用 Python 解释器二进制文件的绝对路径。$ pyenv which python您可以在激活环境时使用该路径来确认。最实质性的事情pyenv activate是将解释器二进制文件添加到您的PATH文件中pythonpython3以便 , 等将解析为它[2]pyenv您的初始化命令仅.bashrc用于启用 shell 自动完成、重新哈希填充程序和定义pyenvshell 函数[3]

总而言之:

#!/bin/bash

"${PYENV_ROOT}/versions/<venv name>/bin/python" script.py
Run Code Online (Sandbox Code Playgroud)