如何在Shell脚本中检查当前环境是否满足requirements.txt依赖?
解决方案:用pip模拟安装检查依赖满足情况
可以利用pip的模拟安装功能,结合禁止联网和本地源的参数,实现无安装、无网络的依赖检查,直接返回布尔结果。
Shell脚本实现
#!/bin/bash # 检查requirements.txt文件是否存在 if [ ! -f "./requirements.txt" ]; then echo "0" exit 1 fi # 调用pip执行模拟安装检查,禁止联网、不实际安装 pip install --dry-run --no-index --find-links=/dev/null -r "./requirements.txt" > /dev/null 2>&1 # 根据pip的返回值输出布尔结果(1=满足,0=不满足) if [ $? -eq 0 ]; then echo "1" else echo "0" fi
原理说明
--dry-run:让pip仅执行安装前的依赖检查逻辑,不实际下载或安装任何包--no-index:禁止pip从PyPI等远程索引查找包--find-links=/dev/null:指定一个空的本地包源,确保pip无法找到任何未安装的包- 当所有依赖都已满足requirements.txt的版本要求时,pip模拟安装会成功(返回值0);若有缺失或版本不匹配的依赖,pip会因无法找到符合要求的包而报错(返回值非0)
适配CMake场景
在CMake中,你可以通过execute_process调用这个脚本,根据返回的1/0来决定是否创建虚拟环境:
execute_process( COMMAND bash ${CMAKE_SOURCE_DIR}/check_deps.sh OUTPUT_VARIABLE DEPS_SATISFIED OUTPUT_STRIP_TRAILING_WHITESPACE ) if(DEPS_SATISFIED STREQUAL "1") # 依赖满足,直接使用当前环境 message(STATUS "Python dependencies are satisfied, using current environment") else() # 依赖不满足,创建虚拟环境并安装依赖 message(STATUS "Python dependencies not satisfied, creating virtual environment") # 这里添加创建venv和安装依赖的逻辑 endif()
注意事项
- 确保脚本中调用的
pip是目标Python环境的pip(比如系统Python的pip,或指定路径的虚拟环境pip) - 若requirements.txt中包含本地包路径,需调整
--find-links参数指向对应目录,但此场景下不影响核心检查逻辑 - 建议使用pip 20.0及以上版本,避免旧版本在版本约束匹配上的差异
内容的提问来源于stack exchange,提问作者ddulaney
相关产品推荐
相关产品推荐

