这个bash的代码,是我在不断的重装系统、python、qt及相关库的过程中的副产品。旨在一次性将整理好的库一次安装到位,如果遇到依赖问题,因为是之前已经解决过的,则多执行几遍就可以了。
sudo /usr/bin/bash .sh文件名
#!/usr/bin/bash
#自动安装当前目录下的 Python 包(.whl或*.tar.gz)RED='\033[1;31m' #红色加粗
GREEN='\033[1;32m' #绿色加粗
NC='\033[0m' #无颜色
#检查 pip3.9 是否可用
if ! command -v pip3.9 &> /dev/null; then
echo -e "${RED}错误 pip3.9 未安装或未在 PATH 中。"
echo -e "请先安装 Python3.9 或确保 pip3.9 在 PATH 中。"
exit 1
fi
#检查 pipdeptree 是否可用
if pip3.9 show pipdeptree >/dev/null 2>&1; then
echo -e "${RED}请先安装 pipdeptree 后再运行本程序。"
exit 1
fi
#遍历源文件夹中的所有文件 .whl 和 *.tar.gz 文件
echo -e "${GREEN}开始安装当前目录下的 Python 包..."
for file in *.whl *.tar.gz; do
if [ -e "$file" ]; then
echo -e "${RED}正在处理: $file"
#创建一个目录来存放提取的包信息
TMP_DIR=$(mktemp -d)
#解压文件到临时文件目录
PACKAGE_PATH=$file
if [[ "$PACKAGE_PATH" == *.tar.gz ]]; then
#解压.tar.gz文件
echo -e "${GREEN}.tar.gz文件。"
tar -xzf "$PACKAGE_PATH" -C "$TMP_DIR"
#查找 setup.py 文件的路径
SETUP_PY_PATH=$(find "$TMP_DIR" -name "setup.py" -print -quit)
#判断是否是 Python 的安装包,Python 安装包.tar.gz内一般包含 setup.py 文件
if [ -z "$SETUP_PY_PATH" ]; then
echo -e "${RED}该安装包非 Python 安装包:" "$file"
rm -rf "$TMP_DIR"
continue
fi
#从 setup.py 文件中提取文件名 ,判断包是否安装,如果没有则进行安装
PACKAGE_NAME=$(grep -oP "name\s*=\s*['\"]\K[^'\"]+" "$SETUP_PY_PATH")
if [ -z "$PACKAGE_NAME" ]; then
echo -e "${RED}无法提取文件名!"
rm -rf "$TMP_DIR"
continue
fi
if pip3.9 show "$PACKAGE_NAME" >/dev/null 2>&1; then
echo -e"${GREEN}该安装包是" "$PACKAGE_NAME" "的安装包,且已经安装!"
else
echo -e "${GREEN}正在安装:" "$file" sudo pip3.9 install "$file"
fi
elif [[ "$PACKAGE_PATH" == *.whl ]]; then
#解压.whl文件
echo -e "${GREEN}.whl文件。"
unzip -q "$PACKAGE_PATH" -d "$TMP_DIR" #查找 setup.py 文件的路径
SETUP_PY_PATH=$(find "$TMP_DIR" -name "METADATA" -print -quit)
#判断是否是 Python 的安装包,Python 安装包.whl内一般包含 METADATA 文件
if [ -z "$SETUP_PY_PATH" ]; then
echo -e "${RED}该安装包非 Python 安装包:" "$file"
rm -rf "$TMP_DIR"
continue
fi
#从 METADATA 文件中提取文件名 ,判断包是否安装,如果没有则进行安装
PACKAGE_NAME=$(grep -i "^Name:" "$SETUP_PY_PATH" | cut -d ' ' -f 2-)
if [ -z "$PACKAGE_NAME" ]; then
echo -e "${RED}无法提取文件名!"
rm -rf "$TMP_DIR"
continue
fi
if pip3.9 show "$PACKAGE_NAME" >/dev/null 2>&1; then
echo -e"${GREEN}该安装包是" "$PACKAGE_NAME" "的安装包,且已经安装!"
else
echo -e "${GREEN}正在安装:" "$file" sudo pip3.9 install "$file"
fi
else
#不支持的格式
echo -e "${RED}不支持的文件格式!"
rm -rf "$TMP_DIR"
exit 1
fi
fi
done
#清理临时目录
echo -e "${GREEN}删除临时目录..."
rm -rf "$TMP_DIR"echo -e "${GREEN}所有包及其依赖安装完成!"
后续大家可以再补充一下对于依赖的判断,没有想好怎么弄。