shell脚本运行source $(pipenv --venv)/bin/activate提示未找到如何解决
source $(pipenv --venv)/bin/activate的作用
pipenv --venv会输出当前项目对应的pipenv虚拟环境的本地绝对路径- 虚拟环境目录下的
/bin/activate是官方提供的激活脚本,执行后会修改当前shell的环境变量,让后续执行的python、pip、第三方工具命令优先调用虚拟环境内安装的版本,和系统全局环境隔离 source是shell内置命令,作用是在当前shell进程内执行目标脚本,保证激活脚本修改的环境变量对同脚本内后续执行的命令生效;如果不用source直接执行activate,脚本会在独立子进程内运行,环境变量修改不会传递到父进程,后续执行flask还是会调用全局环境的版本。
脚本报source: not found的原因和解决方法
报错原因
你脚本首行声明的是#!/bin/sh,绝大多数Linux发行版中/bin/sh默认链接的是dash而非bash,dash没有内置source命令,所以无法识别该指令。
如果后续还出现pipenv: not found的报错,是因为非交互式运行的shell脚本默认不会加载当前用户的~/.bashrc/~/.zshrc等配置文件,如果你是通过用户级pip安装的pipenv(默认安装路径为~/.local/bin),该路径不在脚本运行时的PATH环境变量内,就会找不到pipenv命令。
解决方法
推荐优先选第一种方案:
- 修改脚本解释器为bash
把脚本第一行替换为#!/bin/bash即可,bash原生支持source命令,也会加载更多用户环境配置,大部分情况下可以直接找到已安装的pipenv。如果还是找不到pipenv,可以手动把pipenv所在路径加入脚本的PATH变量,修改后的示例如下:
#!/bin/bash # 找不到pipenv时取消下一行注释 # export PATH=$PATH:~/.local/bin export FLASK_APP=./myapp/index.py source $(pipenv --venv)/bin/activate flask run -h 0.0.0.0
- 不修改解释器的兼容写法
如果必须保留#!/bin/sh的声明,可以把source替换为dash支持的.命令:
. $(pipenv --venv)/bin/activate
- 更稳妥的简化写法
不需要手动激活虚拟环境,直接用pipenv run执行后续命令即可,不需要处理source相关的兼容问题,脚本可以直接简化为:
#!/bin/bash export FLASK_APP=./myapp/index.py pipenv run flask run -h 0.0.0.0
内容的提问来源于stack exchange,提问作者iFunction
相关产品推荐
相关产品推荐

