本脚本用于Linux安装python3.x, 需要指定python版本,如12代表3.12
安装文件下载自 python-build-standalone
我下载的文件后缀是:-x86_64-unknown-linux-gnu-pgo-full.tar.zst,根据需要自行下载
注意:install_only或tar.gz包的目录没有install这一层文件夹
#!/bin/bash
# 本脚本用于Linux安装python3.x, 需要指定python版本,如12代表3.12
# 安装文件下载自 [python-build-standalone](https://github.com/indygreg/python-build-standalone/releases)
# 注意:install_only或tar.gz包的目录没有install这一层文件夹
# 我下载的文件后缀是:-x86_64-unknown-linux-gnu-pgo-full.tar.zst,根据需要自行下载
# 已换用 -x86_64-unknown-linux-gnu-install_only.tar.gz 后缀
# 参数处理
# 第一个参数为python版本,3.x的后一位,必填
# 第二个参数为zip文件夹路径,默认为~/Downloads
# 使用示例
# ./install_python.sh -v 12 -d /home/gxc/Downloads
show_help() {
echo "Usage: $0 [options]"
echo " -h, --help 显示帮助信息"
echo " -v, --version 指定python版本,如12代表3.12"
echo " -e, --ext 指定文件名后缀,默认为zst"
echo " -d, --dir 指定zip文件夹路径,默认为~/Downloads"
echo " -p, --prefix 指定python安装目录,默认为/usr/local/python3x"
echo " -b, --bin 指定python软链接目录,默认为/usr/bin/"
echo " -n, --name 指定python安装目录名,默认为python3x"
}
# 解析参数
while [ "$#" -gt 0 ]; do
case "$1" in
-h|--help)
show_help
exit 0
;;
-v|--version)
v=$2
shift 2
;;
-e|--ext)
ext=$2
shift 2
;;
-d|--dir)
zip_dir=$2
shift 2
;;
-p|--prefix)
prefix=$2
shift 2
;;
-b|--bin)
bin=$2
shift 2
;;
-n|--name)
name=$2
shift 2
;;
*)
echo "Unknown option: $1"
show_help
exit 1
;;
esac
done
if [ -z "$v" ]; then
echo "Error: No python3.x version specified, please specify the version, like '12'"
exit 1
fi
python_version="3.$v"
echo "version: $python_version"
zip_dir=${zip_dir:-~/Downloads}
echo "zip dir: $zip_dir"
prefix=${prefix:-/usr/local/python3$v}
bin=${bin:-/usr/bin/}
name=${name:-python3$v}
py_bin_link=$bin$name
# 进入zip_dir
echo "enter $zip_dir"
pushd $zip_dir > /dev/null 2>&1
# 使用find命令搜索最新的.zst文件
fp=$(find . -type f -name "cpython-$python_version*.$ext" -printf '%T+ %p\n' | sort | tail -n 1 | cut -d' ' -f2-)
# 检查是否找到了文件
if [ -z "$fp" ]; then
echo "Error: No .$ext file found in the directory: $zip_dir"
exit 1
else
echo "The found .$ext file is: $fp"
read -p "Do you want to continue? (y/n): " answer
case $answer in
[Yy]* )
echo "Continuing..."
;;
[Nn]* )
echo "Exiting..."
exit 0
;;
* )
echo "Invalid input. Exiting..."
exit 1
;;
esac
fi
echo "file: $fp"
# 删除旧的python解压目录
if [ -a 'python' ]
then
echo "dir 'python' exists, remove it"
rm -rf python
fi
# 解压前删除旧的解压目录
if [ -a $bin/python ]
then
echo "dir $bin/python exists, remove it"
sudo rm -rf $bin/python
fi
# 解压
echo "unzip $fp"
if [ "$ext" == "zst" ]
then
sudo tar xf $fp -C $bin
elif [ "$ext" == "tar.gz" ]
then
sudo tar zxf $fp -C $bin
else
echo "Error: Unsupported file extension: $ext"
exit 1
fi
# 检查解压后的文件
echo "check unzip file"
if [ ! -d $bin/python ]
then
echo "Error: No 'python' directory found in the zip file: $fp"
exit 1
fi
# 删除旧的python安装目录
if [ -a $prefix ]
then
echo "remove old python"
sudo rm -rf $prefix
fi
# 移动解压的python到指定目录
echo "move python to $prefix"
sudo mv $bin/python $prefix
# 创建软链接
# 定义可能的Python二进制文件路径
possible_paths=(
"$prefix/install/bin/python$python_version"
"$prefix/bin/python$python_version"
)
# 遍历可能的路径并创建软链接
for py_bin in "${possible_paths[@]}"; do
if [ -x "$py_bin" ]; then
echo "link $py_bin -> $py_bin_link"
sudo ln -sf "$py_bin" "$py_bin_link"
break # 找到第一个可执行文件后退出循环
fi
done
# 如果没有找到可执行文件,输出错误信息
if [ ! -L "$py_bin_link" ]; then
echo "错误:未找到可执行的 Python 二进制文件"
fi
# 清理软链接 自用
if [ -L /usr/lib/libpython3.$v.so.1.0 ]
then
echo "unlink /usr/lib/libpython3.$v.so.1.0"
sudo unlink /usr/lib/libpython3.$v.so.1.0
fi
if [ -L /usr/lib64/libpython3.$v.so.1.0 ]
then
echo "unlink /usr/lib64/libpython3.$v.so.1.0"
sudo unlink /usr/lib64/libpython3.$v.so.1.0
fi
# 回到原目录
popd > /dev/null 2>&1
echo "finish install python$python_version"
echo "若发生问题,可使用以下命令临时解决:"
echo "alias $name=$py_bin"