python基础语法9,用os库实现系统操作并用sys库实现文件操作(简单易上手的python语法教学)
一、os库
os.system()
是 Python os
库中用于执行操作系统命令的重要方法,它允许在 Python 程序中直接调用系统 shell 命令(如 Linux 的 bash 命令或 Windows 的 cmd 命令)。
基本语法
import os
os.system(command)
command
:要执行的系统命令字符串(与在终端 / 命令提示符中输入的命令格式一致)- 返回值:命令执行的退出状态码(0 表示成功,非 0 表示执行出错)
工作原理
os.system()
会创建一个子进程来执行指定的命令,并且会等待命令执行完成后再继续执行 Python 程序。在命令执行期间,Python 程序会阻塞(暂停)。
常用示例
1. 执行简单命令
import os# 在Linux/macOS中列出当前目录内容
os.system("ls")# 在Windows中列出当前目录内容
os.system("dir")# 创建文件夹
os.system("mkdir new_folder")# 删除文件
os.system("rm test.txt") # Linux/macOS
# os.system("del test.txt") # Windows
2. 获取命令执行结果
import os# 执行命令并获取退出状态码
status = os.system("echo Hello World")
print(f"退出状态码: {status}") # 成功执行返回0# 执行错误命令
error_status = os.system("invalid_command")
print(f"错误状态码: {error_status}") # 非0值表示执行失败
3. 执行复杂命令
可以执行包含管道、重定向等的复杂命令:
import os# 将命令输出重定向到文件
os.system("ls -l > file_list.txt")# 使用管道命令
os.system("ps aux | grep python") # Linux/macOS
4. 结合变量使用
import osfolder_name = "my_folder"
# 动态生成命令
os.system(f"mkdir {folder_name}")
注意事项
平台差异性:
- 不同操作系统的命令语法不同(如 Linux 的
rm
和 Windows 的del
) - 建议在跨平台程序中使用条件判断:
- 不同操作系统的命令语法不同(如 Linux 的
import os
import sysif sys.platform.startswith('win'):os.system("dir") # Windows命令
else:os.system("ls") # Linux/macOS命令
2.安全性问题:
避免直接使用用户输入作为命令参数,可能导致命令注入攻击:
# 不安全的做法
user_input = "test; rm -rf /" # 恶意输入
os.system(f"echo {user_input}")
3.局限性:
- 只能获取命令的退出状态码,无法直接获取命令输出内容
- 对于需要捕获输出的场景,建议使用
subprocess
模块
4.替代方案:
Python 3.5+ 推荐使用更强大的 subprocess
模块,它提供了更灵活的进程管理功能:
import subprocess# 捕获命令输出
result = subprocess.run("ls -l", shell=True, capture_output=True, text=True)
print(result.stdout) # 输出命令执行结果
print(result.returncode) # 输出退出状态码
适用场景
- 执行简单的系统命令
- 快速脚本开发
- 需要在 Python 中整合少量系统命令的场景
二、sys库
sys
库是 Python 标准库中用于与 Python 解释器交互的核心模块,提供了一系列关于 Python 运行环境、命令行参数、标准输入输出等的操作接口。它与操作系统交互密切,常用于获取程序运行信息、控制程序退出、处理命令行参数等场景。
一、常用功能及示例
1. 命令行参数:sys.argv
sys.argv
是一个列表,存储程序运行时传入的命令行参数。其中:
sys.argv[0]
表示程序本身的路径 / 文件名sys.argv[1:]
表示后续传入的参数
示例代码:
import sys# 打印所有命令行参数
print("命令行参数列表:", sys.argv)
print("程序文件名:", sys.argv[0])
print("传入的参数数量:", len(sys.argv) - 1)
print("传入的参数:", sys.argv[1:])
运行方式(终端):
python demo.py hello world 123
输出:
命令行参数列表: ['demo.py', 'hello', 'world', '123']
程序文件名: demo.py
传入的参数数量: 3
传入的参数: ['hello', 'world', '123']
2. 退出程序:sys.exit()
sys.exit([status])
用于终止当前程序运行,可选参数 status
表示退出状态码(0 表示正常退出,非 0 表示异常退出)。
示例代码:
import sysprint("程序开始")# 判断条件,决定是否退出
if len(sys.argv) < 2:print("错误:未传入参数")sys.exit(1) # 异常退出,状态码 1print("程序正常执行完成")
sys.exit(0) # 正常退出,状态码 0
3. Python 解释器信息
sys.version
:获取 Python 解释器版本信息sys.version_info
:以元组形式返回版本号(主版本、次版本等)sys.platform
:获取当前运行的操作系统平台(如win32
、linux
、darwin
等)
示例代码:
import sysprint("Python 版本:", sys.version)
print("版本号元组:", sys.version_info)
print("是否为 Python 3.6+:", sys.version_info >= (3, 6))
print("操作系统平台:", sys.platform)
输出:
Python 版本: 3.9.7 (default, Sep 16 2021, 16:59:28) [MSC v.1916 64 bit (AMD64)]
版本号元组: sys.version_info(major=3, minor=9, micro=7, releaselevel='final', serial=0)
是否为 Python 3.6+: True
操作系统平台: win32
4. 标准输入输出 / 错误流
sys.stdin
、sys.stdout
、sys.stderr
分别表示标准输入、标准输出、标准错误流,可用于重定向输入输出。
示例:重定向打印输出到文件
import sys# 保存原始 stdout
original_stdout = sys.stdout# 重定向到文件
with open("output.txt", "w") as f:sys.stdout = fprint("这段文字会被写入文件")print("而不是显示在控制台")# 恢复原始 stdout
sys.stdout = original_stdout
print("现在恢复正常输出")
5. 模块搜索路径:sys.path
sys.path
是一个列表,存储 Python 解释器搜索模块的路径。当使用 import
导入模块时,解释器会从这些路径中查找模块。
示例代码:
import sysprint("模块搜索路径:")
for path in sys.path:print(f"- {path}")# 临时添加自定义路径(用于导入指定目录的模块)
sys.path.append("D:/my_modules")
print("\n添加自定义路径后:")
print(sys.path[-1]) # 打印最后添加的路径
6. 递归限制:sys.getrecursionlimit()
和 sys.setrecursionlimit()
Python 对递归调用的深度有默认限制(默认约 1000),可通过这两个方法查看或修改限制值。
示例代码:
import sysprint("默认递归深度限制:", sys.getrecursionlimit())# 修改递归深度限制
sys.setrecursionlimit(2000)
print("修改后的递归深度限制:", sys.getrecursionlimit())
二、综合示例
import sysdef sys_demo():# 1. 处理命令行参数print("===== 命令行参数 =====")if len(sys.argv) > 1:print("传入的参数:", sys.argv[1:])else:print("未传入任何参数")# 2. 显示 Python 环境信息print("\n===== Python 环境 =====")print(f"版本:{sys.version.split()[0]}")print(f"运行平台:{sys.platform}")# 3. 演示标准输出重定向print("\n===== 输出重定向 =====")original_stdout = sys.stdoutwith open("temp.log", "w") as f:sys.stdout = fprint("这条信息被写入到 temp.log")sys.stdout = original_stdoutprint("已将部分输出写入 temp.log")# 4. 模块搜索路径print("\n===== 模块搜索路径 =====")print(f"当前工作目录是否在搜索路径中:{os.getcwd() in sys.path}") # 需要导入 os# 5. 退出程序print("\n程序即将退出")sys.exit(0)if __name__ == "__main__":sys_demo()
三、注意事项
sys
库与os
库的区别:sys
主要针对 Python 解释器本身,os
主要针对操作系统交互。命令行参数处理复杂时,建议使用
argparse
模块(基于sys.argv
封装,更强大)。修改
sys.path
时,建议使用临时添加(程序结束后失效),避免污染全局路径。重定向输入输出后,记得恢复原始流,否则可能导致后续打印异常。