Python Linux解压安装脚本

本脚本用于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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值