使用Makefile自动化虚拟环境及依赖安装的问题求助
如何在单个Makefile规则中完成虚拟环境创建与依赖安装?
问题描述
我想要写一个Makefile来自动化虚拟环境创建和项目依赖安装,目前写了这样的规则:
setup-env: sudo apt-get install python3 pip pip install pipenv pipenv shell pipenv install
现在能成功安装Python、pipenv并创建虚拟环境,但最后一行pipenv install始终不执行——因为运行pipenv shell后控制权切换到了虚拟环境的交互式shell里,只有退出后这条命令才会跑。想问问有没有办法不用拆分规则,在同一个规则里完成所有操作?
解决方案
问题出在pipenv shell这个命令上:它会启动一个交互式的shell会话,直接接管当前终端的控制权,所以后续的命令会被挂起,直到你手动退出这个shell才会执行。
其实你完全不需要进入虚拟环境就能安装依赖——pipenv install本身就具备自动创建虚拟环境的功能(如果环境还不存在的话),直接执行它就能完成虚拟环境创建+依赖安装的整套流程。
修改后的Makefile规则如下:
setup-env: sudo apt-get update && sudo apt-get install -y python3 python3-pip pip3 install --user pipenv export PATH=$$HOME/.local/bin:$$PATH && pipenv install
我还做了几个实用的优化:
- 加上
apt-get update确保系统包列表是最新的,-y参数自动确认安装,避免手动交互 - 用
pip3代替pip,明确指向Python3的包管理器,避免和Python2的pip混淆 - 用
--user参数安装pipenv到用户目录,不需要sudo,更安全;但这个路径默认可能不在系统PATH里,所以需要临时把~/.local/bin加到PATH里,确保Make能找到pipenv命令 - 如果你的项目根目录已经有
Pipfile和Pipfile.lock,pipenv install会直接安装其中定义的依赖;如果没有,它会创建新的Pipfile并初始化环境
如果之后你需要手动进入虚拟环境,可以单独加一个简单的规则:
shell: pipenv shell
运行make shell就能直接进入虚拟环境了。
内容的提问来源于stack exchange,提问作者Harsh Pancholi
相关产品推荐
相关产品推荐

