
第三章 系统类模块
本章节之后会讲述一些创建的标准库使用方式,本文主要介绍两种模块os以及sys模块
os 模块是 Python 标准库中用于与操作系统交互的核心模块,提供了访问文件系统、环境变量、进程管理、路径操作等功能。它是编写跨平台(Windows、macOS、Linux)脚本的重要工具。
import os⚠️ 注意
:os 模块本身不处理路径拼接的跨平台问题(如/ vs\),推荐配合os.path 或更现代的pathlib 使用。
os.path 子模块)虽然 os.path 是独立子模块,但通常与 os 一起使用。
import os
# 获取当前工作目录
cwd = os.getcwd()
print("当前目录:", cwd)
# 改变工作目录
os.chdir("/tmp")
# 路径拼接(自动处理斜杠)
path = os.path.join("folder", "subfolder", "file.txt")
print(path) # folder/subfolder/file.txt (Linux/macOS) 或 folder\subfolder\file.txt (Windows)
# 路径解析
full_path = "/home/user/docs/report.pdf"
print(os.path.basename(full_path)) # "report.pdf"
print(os.path.dirname(full_path)) # "/home/user/docs"
print(os.path.split(full_path)) # ("/home/user/docs", "report.pdf")
# 检查路径是否存在
if os.path.exists("/etc/passwd"):
print("文件存在")
# 检查类型
print(os.path.isfile("test.txt")) # 是否是文件
print(os.path.isdir("my_folder")) # 是否是目录
print(os.path.islink("symlink")) # 是否是符号链接
# 获取绝对路径
abs_path = os.path.abspath("relative/path")
print(abs_path)
# 规范化路径(处理 . 和 ..)
norm = os.path.normpath("/a/b/../c/./d")
print(norm) # /a/c/d✅ 替代方案:Python 3.4+ 推荐使用
pathlib.Path(更面向对象、更简洁):from pathlib import Path p = Path("folder") / "subfolder" / "file.txt"
# 创建单层目录
os.mkdir("new_folder")
# 创建多层目录(类似 mkdir -p)
os.makedirs("parent/child/grandchild", exist_ok=True)
# 删除文件
os.remove("old_file.txt")
# 删除空目录
os.rmdir("empty_folder")
# 删除非空目录(需用 shutil)
import shutil
shutil.rmtree("non_empty_folder")# 列出目录下所有文件和子目录名
files = os.listdir("/home/user")
print(files)
# 遍历目录树(生成器,节省内存)
for root, dirs, files in os.walk("/home/user"):
print(f"当前目录: {root}")
print(f"子目录: {dirs}")
print(f"文件: {files}")
print("-" * 30)stat_info = os.stat("example.txt")
print(f"大小: {stat_info.st_size} 字节")
print(f"修改时间: {stat_info.st_mtime}") # 时间戳
# 更友好的时间格式
import time
mtime = time.ctime(stat_info.st_mtime)
print("修改时间:", mtime)# 获取环境变量
home = os.environ.get("HOME") # 安全获取(不存在返回 None)
user = os.getenv("USER", "default_user") # 可设默认值
# 设置环境变量(仅当前进程有效)
os.environ["MY_VAR"] = "my_value"
# 删除环境变量
if "MY_VAR" in os.environ:
del os.environ["MY_VAR"]# 获取进程 ID
pid = os.getpid()
print("当前进程ID:", pid)
# 获取父进程 ID
ppid = os.getppid()
print("父进程ID:", ppid)
# 执行系统命令(不推荐,有安全风险)
os.system("ls -l") # 返回退出状态码
# 获取系统名称
print(os.name) # 'posix' (Linux/macOS), 'nt' (Windows)
# 获取登录用户名
try:
print(os.getlogin())
except OSError:
import getpass
print(getpass.getuser()) # 更可靠🔒 安全提示:避免使用
os.system()执行用户输入的命令,推荐用subprocess模块。
# 修改文件权限(八进制)
os.chmod("script.sh", 0o755) # rwxr-xr-x
# 修改文件所有者(需 root 权限)
# os.chown("file.txt", uid, gid)功能 | Windows | Unix-like (Linux/macOS) |
|---|---|---|
路径分隔符 |
| |
行结束符 |
|
|
环境变量 |
|
|
可执行文件扩展名 |
| 无 |
✅ 解决方案:
os.path.join() 拼接路径os.linesep 获取当前系统换行符os.sep 获取路径分隔符(但通常不需要)# 跨平台路径示例
config_path = os.path.join(os.path.expanduser("~"), ".myapp", "config.ini")# 展开 ~ 为用户主目录
home_config = os.path.expanduser("~/.bashrc")
# 获取临时目录
tmp_dir = os.environ.get("TMPDIR", "/tmp") # Unix
# 或使用 tempfile 模块更安全
# 生成随机字节(用于临时文件名等)
random_bytes = os.urandom(16) # 16字节随机数据pathlib 对比(Python 3.4+)操作 |
|
|
|---|---|---|
路径拼接 |
|
|
读取文件 |
|
|
检查存在 |
|
|
遍历目录 |
|
|
✅ 建议:新项目优先使用 pathlib,旧代码或简单脚本可用 os.path。
import os
folder = "photos"
for i, filename in enumerate(os.listdir(folder)):
if filename.endswith(".jpg"):
old_path = os.path.join(folder, filename)
new_path = os.path.join(folder, f"photo_{i:03d}.jpg")
os.rename(old_path, new_path)def find_large_files(directory, min_size_mb=100):
min_size = min_size_mb * 1024 * 1024
for root, _, files in os.walk(directory):
for file in files:
path = os.path.join(root, file)
try:
if os.path.getsize(path) > min_size:
print(f"{path} ({os.path.getsize(path) / 1024 / 1024:.1f} MB)")
except OSError:
pass # 跳过无法访问的文件
find_large_files("/home/user", 50)def create_project_structure(project_name):
dirs = [
f"{project_name}/src",
f"{project_name}/tests",
f"{project_name}/docs"
]
for d in dirs:
os.makedirs(d, exist_ok=True)
# 创建初始化文件
with open(f"{project_name}/src/__init__.py", "w") as f:
pass
create_project_structure("my_project")os.path.join() 拼接路径,避免硬编码 / 或 \exist_ok=True 避免 FileExistsErrorpathlib(Python 3.4+)os.system() 执行外部命令,改用 subprocess# 错误:硬编码路径分隔符
path = "folder\\subfolder\\file.txt" # Windows only
# 正确
path = os.path.join("folder", "subfolder", "file.txt")
# 错误:直接拼接字符串
path = user_input + "/config.txt" # 可能导致路径遍历漏洞
# 正确:使用 os.path.join 并验证路径
base = "/safe/base/dir"
path = os.path.join(base, user_input)
if not path.startswith(base):
raise ValueError("Invalid path")功能类别 | 常用函数/属性 |
|---|---|
路径操作 |
|
目录操作 |
|
文件操作 |
|
环境变量 |
|
进程信息 |
|
系统信息 |
|
🔑 核心思想:
os模块让你用统一的 Python 接口操作不同操作系统的底层功能,实现跨平台兼容性。
sys 模块是 Python 标准库中用于与 Python 解释器及其运行环境交互的核心模块。它提供了访问命令行参数、退出程序、获取 Python 版本、操作模块搜索路径等功能,常用于脚本控制、调试和系统级编程。
import syssys.argv)获取传递给 Python 脚本的命令行参数。
# script.py
import sys
print("脚本名:", sys.argv[0])
print("参数个数:", len(sys.argv) - 1)
print("所有参数:", sys.argv[1:])
# 运行:python script.py hello 123 --verbose
# 输出:
# 脚本名: script.py
# 参数个数: 3
# 所有参数: ['hello', '123', '--verbose']✅ 用途:编写 CLI 工具、批处理脚本。
sys.exit())优雅地终止程序,可指定退出状态码。
import sys
if not user_authenticated:
print("认证失败!", file=sys.stderr)
sys.exit(1) # 非0表示错误
print("程序正常运行...")
sys.exit(0) # 0 表示成功(可省略)sys.exit() 本质是抛出 SystemExit 异常,可被捕获(但通常不建议)。0:成功0:错误(如 1, 2 等)sys.stdin, sys.stdout, sys.stderr)重定向或操作标准流。
import sys
# 读取所有标准输入(类似 cat)
# data = sys.stdin.read()
# 写入标准输出
sys.stdout.write("Hello, stdout!\n")
# 写入标准错误(用于错误信息)
sys.stderr.write("Error: something went wrong!\n")
# 重定向输出到文件
with open("output.log", "w") as f:
sys.stdout = f
print("这条信息会写入文件")
sys.stdout = sys.__stdout__ # 恢复原始 stdout💡
print()默认输出到sys.stdout,错误信息应输出到sys.stderr。
import sys
print("Python 版本:", sys.version) # 详细版本字符串
print("Python 版本信息:", sys.version_info) # 命名元组 (major=3, minor=10, ...)
print("平台:", sys.platform) # 'linux', 'win32', 'darwin' (macOS)
print("可执行文件路径:", sys.executable) # Python 解释器路径
print("模块搜索路径:", sys.path) # 列表,解释器查找模块的位置✅ 用途:条件兼容不同平台或版本。
if sys.version_info < (3, 8):
raise RuntimeError("需要 Python 3.8+")sys.modules已加载的模块字典(缓存),可用于检查或强制重载。
import json
print('json' in sys.modules) # True
# 强制重载模块(调试时用)
import importlib
importlib.reload(json)sys.pathPython 查找模块的路径列表,可动态修改。
# 添加自定义模块路径
sys.path.insert(0, "/my/custom/modules")
# 现在可以导入该路径下的模块
import my_module⚠️ 修改
sys.path 会影响整个解释器会话。
sys.getrecursionlimit(), sys.setrecursionlimit())防止无限递归导致栈溢出。
import sys
print("默认递归限制:", sys.getrecursionlimit()) # 通常 1000
# 增加限制(谨慎使用!)
sys.setrecursionlimit(2000)
def factorial(n):
if n <= 1:
return 1
return n * factorial(n - 1)
print(factorial(500)) # 可能需要更高递归限制❗ 过高的递归限制可能导致程序崩溃。
sys.stdout.flush())确保输出立即显示(尤其在循环或长时间运行任务中)。
import sys
import time
for i in range(5):
sys.stdout.write(f"\r进度: {i+1}/5")
sys.stdout.flush() # 立即输出
time.sleep(1)
print("\n完成!")💡 在 Jupyter 或 IDE 中可能自动刷新,但在终端脚本中常需手动刷新。
sys.getrefcount())用于调试内存管理(CPython 特有)。
import sys
a = []
print(sys.getrefcount(a)) # 至少为 2(a 和 getrefcount 的参数)🔍 一般开发者很少使用,主要用于底层调试。
import sys
def main():
if len(sys.argv) != 2:
print("用法: python tool.py <filename>", file=sys.stderr)
sys.exit(1)
filename = sys.argv[1]
try:
with open(filename) as f:
print(f.read())
except FileNotFoundError:
print(f"错误: 文件 {filename} 不存在", file=sys.stderr)
sys.exit(2)
if __name__ == "__main__":
main()import sys
import traceback
def handle_exception(exc_type, exc_value, exc_traceback):
if issubclass(exc_type, KeyboardInterrupt):
sys.__excepthook__(exc_type, exc_value, exc_traceback)
return
print("程序崩溃!详细信息已记录到 error.log", file=sys.stderr)
with open("error.log", "w") as f:
traceback.print_exception(exc_type, exc_value, exc_traceback, file=f)
sys.excepthook = handle_exceptionimport sys
import io
# 强制 stdout 使用 UTF-8(Windows 常见问题)
if sys.stdout.encoding != 'utf-8':
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')sys vs os 模块对比功能 |
|
|
|---|---|---|
作用对象 | Python 解释器本身 | 操作系统 |
命令行参数 | ✅ | ❌ |
退出程序 | ✅ | ❌(但 |
环境变量 | ❌ | ✅ |
文件/目录操作 | ❌ | ✅ |
标准流 | ✅ | ❌ |
Python 版本 | ✅ | ❌ |
💡 两者常配合使用:import sys, os if sys.platform == "win32": os.system("cls") else: os.system("clear")
sys.exit() 代替 exit()(后者是内置函数,仅适用于交互式环境)sys.stderrsys.argv 长度避免 IndexErrorsys.version_info 做版本判断(而非字符串比较)# 不推荐:使用内置 exit()
exit(1)
# 推荐
sys.exit(1)
# 不安全:直接修改 sys.modules
sys.modules['json'] = None # 可能导致程序崩溃
# 不可靠:依赖 sys.path 顺序
# 应使用虚拟环境或明确安装路径sys 模块核心属性/函数速查功能 | 用法 |
|---|---|
命令行参数 |
|
退出程序 |
|
标准输入 |
|
标准输出 |
|
标准错误 |
|
Python 版本 |
|
操作系统平台 |
|
模块搜索路径 |
|
已加载模块 |
|
递归限制 |
|
刷新输出 |
|
本文主要介绍两种常见的模块的实际应用,方便在不同情况下的操作,欢迎一起来学习,当前我们处于python语言的应用级别,并未涉及到算法库,先掌握基本的语言应用,再继续学习后续人工智能的相关领域的实践。
相关资料获取:
公众号:咚咚王
《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen) 》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。