首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >人工智能之编程进阶 Python高级:第三章 系统类模块

人工智能之编程进阶 Python高级:第三章 系统类模块

原创
作者头像
咚咚王
发布2025-11-18 20:40:21
发布2025-11-18 20:40:21
840
举报

人工智能之编程进阶 Python高级

第三章 系统类模块


前言

本章节之后会讲述一些创建的标准库使用方式,本文主要介绍两种模块os以及sys模块


os模块

os 模块是 Python 标准库中用于与操作系统交互的核心模块,提供了访问文件系统、环境变量、进程管理、路径操作等功能。它是编写跨平台(Windows、macOS、Linux)脚本的重要工具。


一、导入方式

代码语言:python
复制
import os

⚠️ 注意:os 模块本身不处理路径拼接的跨平台问题(如 / vs \),推荐配合 os.path 或更现代的 pathlib 使用。


二、常用功能分类

1. 路径操作(os.path 子模块)

虽然 os.path 是独立子模块,但通常与 os 一起使用。

代码语言:python
复制
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"


2. 文件和目录操作

创建与删除
代码语言:python
复制
# 创建单层目录
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")
列出目录内容
代码语言:python
复制
# 列出目录下所有文件和子目录名
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)
文件信息(元数据)
代码语言:python
复制
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)

3. 环境变量

代码语言:python
复制
# 获取环境变量
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"]

4. 进程与系统信息

代码语言:python
复制
# 获取进程 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 模块。


5. 权限与所有权(Unix/Linux/macOS)

代码语言:python
复制
# 修改文件权限(八进制)
os.chmod("script.sh", 0o755)  # rwxr-xr-x

# 修改文件所有者(需 root 权限)
# os.chown("file.txt", uid, gid)

三、跨平台注意事项

功能

Windows

Unix-like (Linux/macOS)

路径分隔符

\ | / |

行结束符

\r\n

\n

环境变量

os.environ['USERNAME']

os.environ['USER']

可执行文件扩展名

.exe

解决方案

  • 使用 os.path.join() 拼接路径
  • 使用 os.linesep 获取当前系统换行符
  • 使用 os.sep 获取路径分隔符(但通常不需要)
代码语言:python
复制
# 跨平台路径示例
config_path = os.path.join(os.path.expanduser("~"), ".myapp", "config.ini")

四、常用实用函数

代码语言:python
复制
# 展开 ~ 为用户主目录
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+)

操作

os.path

pathlib

路径拼接

os.path.join("a", "b")

Path("a") / "b"

读取文件

open(path).read()

Path(path).read_text()

检查存在

os.path.exists(p)

Path(p).exists()

遍历目录

os.walk()

Path(p).rglob("*.py")

建议:新项目优先使用 pathlib,旧代码或简单脚本可用 os.path


六、典型应用场景

1. 批量重命名文件

代码语言:python
复制
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)

2. 查找大文件

代码语言:python
复制
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)

3. 创建项目目录结构

代码语言:python
复制
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")

七、注意事项与最佳实践

✅ 推荐做法

  1. 使用 os.path.join() 拼接路径,避免硬编码 /\
  2. 检查文件是否存在再操作(但注意竞态条件)
  3. 使用 exist_ok=True 避免 FileExistsError
  4. 优先使用 pathlib(Python 3.4+)
  5. 不要用 os.system() 执行外部命令,改用 subprocess

❌ 避免的做法

代码语言:python
复制
# 错误:硬编码路径分隔符
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.path.join,os.path.exists,os.path.isfile

目录操作

os.listdir,os.walk,os.makedirs

文件操作

os.remove,os.rename,os.stat

环境变量

os.environ,os.getenv

进程信息

os.getpid,os.getppid

系统信息

os.name,os.uname()(Unix)

🔑 核心思想os 模块让你用统一的 Python 接口操作不同操作系统的底层功能,实现跨平台兼容性

sys模块

sys 模块是 Python 标准库中用于与 Python 解释器及其运行环境交互的核心模块。它提供了访问命令行参数、退出程序、获取 Python 版本、操作模块搜索路径等功能,常用于脚本控制、调试和系统级编程。


一、导入方式

代码语言:python
复制
import sys

二、常用功能详解

1. 命令行参数(sys.argv

获取传递给 Python 脚本的命令行参数。

代码语言: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 工具、批处理脚本。


2. 退出程序(sys.exit()

优雅地终止程序,可指定退出状态码。

代码语言:python
复制
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 等)

3. 标准输入/输出/错误流(sys.stdin, sys.stdout, sys.stderr

重定向或操作标准流。

代码语言:python
复制
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


4. Python 解释器信息

代码语言:python
复制
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)          # 列表,解释器查找模块的位置

用途:条件兼容不同平台或版本。

代码语言:python
复制
if sys.version_info < (3, 8):
    raise RuntimeError("需要 Python 3.8+")

5. 模块与导入系统

sys.modules

已加载的模块字典(缓存),可用于检查或强制重载。

代码语言:python
复制
import json
print('json' in sys.modules)  # True

# 强制重载模块(调试时用)
import importlib
importlib.reload(json)
sys.path

Python 查找模块的路径列表,可动态修改。

代码语言:python
复制
# 添加自定义模块路径
sys.path.insert(0, "/my/custom/modules")

# 现在可以导入该路径下的模块
import my_module

⚠️ 修改 sys.path 会影响整个解释器会话。


6. 递归限制(sys.getrecursionlimit(), sys.setrecursionlimit()

防止无限递归导致栈溢出。

代码语言:python
复制
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))  # 可能需要更高递归限制

❗ 过高的递归限制可能导致程序崩溃。


7. 强制刷新输出缓冲(sys.stdout.flush()

确保输出立即显示(尤其在循环或长时间运行任务中)。

代码语言:python
复制
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 中可能自动刷新,但在终端脚本中常需手动刷新。


8. 获取对象引用计数(sys.getrefcount()

用于调试内存管理(CPython 特有)。

代码语言:python
复制
import sys

a = []
print(sys.getrefcount(a))  # 至少为 2(a 和 getrefcount 的参数)

🔍 一般开发者很少使用,主要用于底层调试。


三、典型应用场景

1. 编写命令行工具

代码语言:python
复制
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()

2. 捕获未处理异常(用于日志记录)

代码语言:python
复制
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_exception

3. 动态调整输出编码(解决中文乱码)

代码语言:python
复制
import 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 模块对比

功能

sys 模块

os 模块

作用对象

Python 解释器本身

操作系统

命令行参数

sys.argv

退出程序

sys.exit()

❌(但 os._exit() 可强制退出)

环境变量

os.environ

文件/目录操作

os.remove,os.listdir

标准流

sys.stdin/stdout/stderr

Python 版本

sys.version

💡 两者常配合使用:import sys, os if sys.platform == "win32": os.system("cls") else: os.system("clear")


五、注意事项与最佳实践

✅ 推荐做法

  1. sys.exit() 代替 exit()(后者是内置函数,仅适用于交互式环境)
  2. 错误信息输出到 sys.stderr
  3. 检查 sys.argv 长度避免 IndexError
  4. sys.version_info 做版本判断(而非字符串比较)

❌ 避免的做法

代码语言:python
复制
# 不推荐:使用内置 exit()
exit(1)

# 推荐
sys.exit(1)

# 不安全:直接修改 sys.modules
sys.modules['json'] = None  # 可能导致程序崩溃

# 不可靠:依赖 sys.path 顺序
# 应使用虚拟环境或明确安装路径

六、总结:sys 模块核心属性/函数速查

功能

用法

命令行参数

sys.argv

退出程序

sys.exit([code])

标准输入

sys.stdin

标准输出

sys.stdout

标准错误

sys.stderr

Python 版本

sys.version,sys.version_info

操作系统平台

sys.platform

模块搜索路径

sys.path

已加载模块

sys.modules

递归限制

sys.getrecursionlimit(),sys.setrecursionlimit()

刷新输出

sys.stdout.flush()

总结

本文主要介绍两种常见的模块的实际应用,方便在不同情况下的操作,欢迎一起来学习,当前我们处于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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 人工智能之编程进阶 Python高级
  • 前言
  • os模块
    • 一、导入方式
    • 二、常用功能分类
      • 1. 路径操作(os.path 子模块)
      • 2. 文件和目录操作
      • 3. 环境变量
      • 4. 进程与系统信息
      • 5. 权限与所有权(Unix/Linux/macOS)
    • 三、跨平台注意事项
    • 四、常用实用函数
    • 五、与 pathlib 对比(Python 3.4+)
    • 六、典型应用场景
      • 1. 批量重命名文件
      • 2. 查找大文件
      • 3. 创建项目目录结构
    • 七、注意事项与最佳实践
      • ✅ 推荐做法
      • ❌ 避免的做法
    • 八、总结
  • sys模块
    • 一、导入方式
    • 二、常用功能详解
      • 1. 命令行参数(sys.argv)
      • 2. 退出程序(sys.exit())
      • 3. 标准输入/输出/错误流(sys.stdin, sys.stdout, sys.stderr)
      • 4. Python 解释器信息
      • 5. 模块与导入系统
      • 6. 递归限制(sys.getrecursionlimit(), sys.setrecursionlimit())
      • 7. 强制刷新输出缓冲(sys.stdout.flush())
      • 8. 获取对象引用计数(sys.getrefcount())
    • 三、典型应用场景
      • 1. 编写命令行工具
      • 2. 捕获未处理异常(用于日志记录)
      • 3. 动态调整输出编码(解决中文乱码)
    • 四、sys vs os 模块对比
    • 五、注意事项与最佳实践
      • ✅ 推荐做法
      • ❌ 避免的做法
    • 六、总结:sys 模块核心属性/函数速查
  • 总结
  • 资料关注
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档