Skip to content

Python是什么与环境

Python 在运维里常见于脚本、巡检、批量接口调用、日志处理、配置生成和内部工具。它比 Shell 更适合处理复杂数据结构、异常分支和跨平台逻辑;比完整后端项目更轻,写一个命令行工具或批量任务时启动成本低。

Shell 更贴近系统命令,适合管道、文件过滤、简单批量操作;Python 更适合把多个步骤组织成清楚的函数和模块。脚本逐渐出现大量 if、循环、JSON 解析、接口调用、错误重试时,Python 的可维护性会明显好一些。Shell 基础仍然是前提,常用命令和管道关系见 Shell基础语法

一、Python 运行链路

Python 脚本不是直接被操作系统理解。脚本先交给解释器,解释器加载标准库和第三方包,再调用系统能力完成文件、网络、进程等操作。

运维脚本里经常出现三层问题:

层面常见现象排查入口
解释器python 命令不存在、版本不对python --versionpython3 --versionwhich python3
依赖包ModuleNotFoundErroruv pip listpython3 -m pip list、虚拟环境路径
系统能力权限不足、命令不存在、端口不通Linux 权限、PATH、网络、防火墙

Python 环境这块先分清三个对象:

对象作用常见命令
Python 解释器执行 .py 脚本python3 --version
pipPython 官方包安装工具python3 -m pip install requests
uv更快的 Python 项目、依赖和虚拟环境管理工具uv add requestsuv run python app.py

二、安装 Python

Python 3 是默认选择。老系统里可能还残留 Python 2,尤其是 CentOS 7 这类系统,python 可能指向旧版本。脚本里写了 f-string、类型注解、新版标准库功能时,解释器版本太低会直接语法错误。

安装前先确认当前状态:

bash
python --version
python3 --version
which python
which python3

Rocky / RHEL / CentOS:

bash
# 安装解释器、pip 和 venv 相关组件
dnf install -y python3 python3-pip

# 验证解释器和 pip 是否可用
python3 --version
python3 -m pip --version

Ubuntu / Debian:

bash
apt-get update

# python3-venv 用于创建虚拟环境,python3-pip 用于传统 pip 安装
apt-get install -y python3 python3-venv python3-pip

python3 --version
python3 -m pip --version

Windows 上通常用 python.org 安装包或 winget。安装包里有一个关键选项:把 Python 加入 PATH。没有加入 PATH 时,PowerShell 里会出现 python 找不到。

powershell
# 查看已安装的 Python 启动器
py -0p

# 验证 Python 3
py -3 --version

# 验证 pip
py -3 -m pip --version

服务器脚本里更推荐写 python3 或明确的虚拟环境路径,不依赖 python 这个命令。python 在不同系统上含义不完全一致。

三、安装 uv

uv 是一个独立工具,不等同于 Python 标准库,也不是系统默认自带命令。使用 uv runuv add 之前,机器上要先安装 uv

Linux / macOS 常用安装方式:

bash
# 官方独立安装脚本会把 uv 安装到用户可执行目录
curl -LsSf https://astral.sh/uv/install.sh | sh

# 重新加载 shell 配置后验证
uv --version

Windows PowerShell:

powershell
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

uv --version

如果安装后提示 uv: command not found,通常是 PATH 还没刷新。重新打开终端,或者按安装输出提示把 uv 所在目录加入 PATH。

uv 也能管理 Python 版本。系统 Python 版本不满足脚本要求时,可以让 uv 下载并使用指定版本:

bash
# 查看 uv 能管理的 Python 版本
uv python list

# 安装一个指定版本
uv python install 3.12

# 用指定版本执行命令
uv run --python 3.12 python --version

服务器上已经有稳定的系统 Python 时,不一定要让 uv 再管理一套 Python。开发机、多项目机器、CI 环境里,uv 管理 Python 版本更方便。

四、uv 管理项目

一个运维脚本项目通常需要三类文件:项目配置、锁定文件、脚本目录。

text
ops-scripts/
├── pyproject.toml
├── uv.lock
├── scripts/
│   └── check_disk.py
└── README.md

pyproject.toml 记录项目和依赖,uv.lock 锁定依赖的具体版本,scripts/ 放实际脚本。换机器部署时,锁定文件能让依赖版本保持一致。

创建项目:

bash
uv init ops-scripts
cd ops-scripts

# 查看项目根目录生成的文件
ls -la

添加依赖:

bash
# requests 和 pyyaml 会写入 pyproject.toml,并同步安装到 .venv
uv add requests pyyaml

# 查看当前项目安装了哪些包
uv pip list

运行脚本:

bash
uv run python scripts/check_disk.py

删除依赖:

bash
uv remove pyyaml
uv pip list

同步环境:

bash
# 根据 pyproject.toml 和 uv.lock 同步 .venv
uv sync

更新锁定文件:

bash
# 依赖声明变化后重新解析并写入 uv.lock
uv lock

锁定文件常和项目一起提交。这样另一台机器拿到项目后执行 uv sync,就能恢复同一套依赖环境。

五、uv 与 pip 的关系

pip 是 Python 包安装工具,uv 提供了 pip 兼容命令,也提供项目级管理能力。已有老项目只有 requirements.txt 时,uv 也能直接处理。

用 uv 安装 requirements:

bash
uv pip install -r requirements.txt
uv pip list

把当前环境导出成 requirements:

bash
uv pip freeze > requirements.txt

检查依赖关系:

bash
uv pip check
uv pip tree

新脚本项目更推荐 pyproject.toml + uv.lock;接手老脚本时,requirements.txt 仍然很常见。两种方式不要在同一个项目里混着随意改,否则依赖来源会变乱。

六、pip 换源

国内网络访问 PyPI 慢或超时时,pip 可以改成国内镜像源。临时安装适合一次性操作:

bash
python3 -m pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple

Windows:

powershell
py -3 -m pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple

长期使用可以写入用户级 pip 配置:

bash
python3 -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
python3 -m pip config set global.timeout 60

# 查看当前生效配置
python3 -m pip config list

Windows:

powershell
py -3 -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
py -3 -m pip config set global.timeout 60
py -3 -m pip config list

恢复默认源时删除配置项:

bash
python3 -m pip config unset global.index-url
python3 -m pip config unset global.timeout

常见镜像源:

镜像地址
清华https://pypi.tuna.tsinghua.edu.cn/simple
阿里云https://mirrors.aliyun.com/pypi/simple/
腾讯云https://mirrors.cloud.tencent.com/pypi/simple
华为云https://repo.huaweicloud.com/repository/pypi/simple

配置的是 https 镜像源时,不需要额外设置 trusted-host。只有公司内部 http 源或证书异常的源,才会涉及 trusted-host,这类配置要和内部源证书策略一起看。

七、uv 换源

uv 默认使用 PyPI。临时换源可以在命令里指定 --default-index

bash
uv add requests --default-index https://pypi.tuna.tsinghua.edu.cn/simple
uv pip install requests --default-index https://pypi.tuna.tsinghua.edu.cn/simple

当前 shell 临时生效:

bash
export UV_DEFAULT_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple
uv add requests

Windows PowerShell:

powershell
$env:UV_DEFAULT_INDEX = "https://pypi.tuna.tsinghua.edu.cn/simple"
uv add requests

项目级固定配置写在 pyproject.toml

toml
[[tool.uv.index]]
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
default = true

用户级配置写在 uv.toml。Linux / macOS 常见位置是 ~/.config/uv/uv.toml,Windows 常见位置是 %APPDATA%\uv\uv.toml

toml
[[index]]
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
default = true

default = true 表示把这个源作为默认包索引。公司内部私有源和公共 PyPI 混用时,还要关注索引优先级,避免同名包从不期望的源安装。

八、虚拟环境

虚拟环境用于隔离项目依赖。不同脚本可能依赖不同版本的 requestspymysql 或其他包,全部装进系统 Python 容易互相影响。虚拟环境本质是一套独立的 Python 包目录。

传统方式:

bash
python3 -m venv .venv
source .venv/bin/activate
python -m pip install requests
python check_api.py

用 uv 时通常不需要手动 activate,直接通过 uv run 进入项目环境:

bash
uv run python check_api.py

排查依赖时看两个位置:

bash
# 当前项目的虚拟环境位置
uv run python -c "import sys; print(sys.executable)"

# 当前环境已安装的包
uv pip list

本地能跑、定时任务里失败,经常是工作目录、PATH、虚拟环境路径不一致。cron 或 systemd 里运行 Python 脚本时,命令最好写成项目绝对路径,并明确使用 uv run 或虚拟环境里的 Python。

九、脚本入口

一个最小脚本:

python
#!/usr/bin/env python3
"""输出当前脚本的运行入口示例。"""


def main():
    # 真实脚本的主要逻辑放在 main 里,后续更容易拆函数和测试
    print("hello python")


if __name__ == "__main__":
    main()

第一行 #!/usr/bin/env python3 是 shebang。Linux 上给脚本加执行权限后,可以直接运行:

bash
chmod +x hello.py
./hello.py

if __name__ == "__main__": 用来区分“直接执行”和“被其他脚本 import”。直接执行时会进入 main();被 import 时只加载函数和变量,不会自动跑主流程。运维脚本拆成多个文件时,这个写法很有用。

十、标准库和第三方包

Python 自带的库叫标准库。文件、路径、JSON、日志、子进程这些常用能力都在标准库里:

用途
os环境变量、进程信息、部分系统接口
pathlib路径拼接、文件存在性检查
shutil复制、移动、磁盘使用率
subprocess调系统命令
json读写 JSON
logging输出结构更清楚的日志
configparser读取 ini 配置

第三方包需要安装,例如:

用途
requests调 HTTP API
paramikoSSH 连接远端主机
pymysql连接 MySQL
redis连接 Redis
pyyaml处理 YAML

安装第三方包前先确认项目环境已经建好:

bash
uv init ops-scripts
cd ops-scripts
uv add requests pyyaml
uv run python -c "import requests, yaml; print('ok')"

这条验证命令能确认包已经安装到 uv 管理的环境里,而不是装到了另一个 Python 目录。

十一、第一个检查脚本

下面这个脚本检查磁盘使用率。它只用标准库,适合作为 Python 运维脚本的起点。

python
#!/usr/bin/env python3
"""检查指定挂载点的磁盘使用率。"""

import shutil
import sys


def check_disk(path, warning_percent):
    # shutil.disk_usage 返回 total、used、free,单位是字节
    total, used, free = shutil.disk_usage(path)
    used_percent = used / total * 100

    print(f"path={path} used={used_percent:.2f}% free={free // (1024 ** 3)}GB")

    # 返回布尔值,让 main 决定退出码
    return used_percent < warning_percent


def main():
    path = "/"
    warning_percent = 80

    if check_disk(path, warning_percent):
        sys.exit(0)

    print(f"disk usage reached warning threshold: {warning_percent}%", file=sys.stderr)
    sys.exit(1)


if __name__ == "__main__":
    main()

运行:

bash
uv run python check_disk.py
echo $?

退出码为 0 表示正常,非零表示异常。监控探针、定时任务、CI 任务都很依赖退出码,脚本不能只打印文字而不返回状态。