Makefile执行make activate报错:source: No such file or directory
问题原因与解决方法
核心问题
Makefile默认使用/bin/sh作为执行shell,而source是Bash专属的内置命令。部分系统(比如Debian/Ubuntu)的/bin/sh指向dash,dash不支持source命令,这就是执行make activate报错的原因。你直接在终端执行时用的是Bash,所以能正常运行。
解决方案
方案1:指定Makefile使用Bash执行
在Makefile的最顶部添加一行,强制使用Bash作为命令执行的shell:
SHELL := /bin/bash
之后再执行make activate就能正常识别source命令。
方案2:使用POSIX标准的.命令替代source
source的POSIX兼容等价命令是.,把Makefile里的source env/bin/activate替换为:
. env/bin/activate
这个写法在sh和Bash环境下都能正常工作,兼容性更强。
额外注意
Makefile的每一行命令都会在独立的子shell中执行,所以就算你在Makefile里激活了虚拟环境,后续行的命令并不会继承这个环境,而且也不会改变当前终端的环境。如果需要激活环境后执行一系列命令,要把它们放在同一行(用&&分隔),或者用反斜杠换行保持在同一个子shell里:
activate-run: . env/bin/activate && python your_script.py && pytest tests/
如果你的需求是让当前终端进入虚拟环境,Makefile无法做到(子shell的环境不会传递到父shell),这种情况建议直接在终端执行source env/bin/activate。
内容的提问来源于stack exchange,提问作者strblr
相关产品推荐
相关产品推荐

