python基础语法9,用os库实现系统操作并用sys库实现文件操作(简单易上手的python语法教学)

一、os库

os.system() 是 Python os 库中用于执行操作系统命令的重要方法,它允许在 Python 程序中直接调用系统 shell 命令(如 Linux 的 bash 命令或 Windows 的 cmd 命令)。

基本语法

python 复制代码
import os
os.system(command)
  1. command:要执行的系统命令字符串(与在终端 / 命令提示符中输入的命令格式一致)
  2. 返回值:命令执行的退出状态码(0 表示成功,非 0 表示执行出错)

工作原理

os.system() 会创建一个子进程来执行指定的命令,并且会等待命令执行完成后再继续执行 Python 程序。在命令执行期间,Python 程序会阻塞(暂停)。

常用示例

1. 执行简单命令
python 复制代码
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. 获取命令执行结果
python 复制代码
import os

# 执行命令并获取退出状态码
status = os.system("echo Hello World")
print(f"退出状态码: {status}")  # 成功执行返回0

# 执行错误命令
error_status = os.system("invalid_command")
print(f"错误状态码: {error_status}")  # 非0值表示执行失败
3. 执行复杂命令

可以执行包含管道、重定向等的复杂命令:

python 复制代码
import os

# 将命令输出重定向到文件
os.system("ls -l > file_list.txt")

# 使用管道命令
os.system("ps aux | grep python")  # Linux/macOS
4. 结合变量使用
python 复制代码
import os

folder_name = "my_folder"
# 动态生成命令
os.system(f"mkdir {folder_name}")

注意事项

平台差异性
  1. 不同操作系统的命令语法不同(如 Linux 的rm和 Windows 的del
  2. 建议在跨平台程序中使用条件判断:
python 复制代码
import os
import sys

if sys.platform.startswith('win'):
    os.system("dir")  # Windows命令
else:
    os.system("ls")   # Linux/macOS命令
2.安全性问题

避免直接使用用户输入作为命令参数,可能导致命令注入攻击:

python 复制代码
# 不安全的做法
user_input = "test; rm -rf /"  # 恶意输入
os.system(f"echo {user_input}")

3.局限性

  • 只能获取命令的退出状态码,无法直接获取命令输出内容
  • 对于需要捕获输出的场景,建议使用 subprocess 模块

4.替代方案

Python 3.5+ 推荐使用更强大的 subprocess 模块,它提供了更灵活的进程管理功能:

python 复制代码
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 是一个列表,存储程序运行时传入的命令行参数。其中:

  1. sys.argv[0] 表示程序本身的路径 / 文件名
  2. sys.argv[1:] 表示后续传入的参数

示例代码:

python 复制代码
import sys

# 打印所有命令行参数
print("命令行参数列表:", sys.argv)
print("程序文件名:", sys.argv[0])
print("传入的参数数量:", len(sys.argv) - 1)
print("传入的参数:", sys.argv[1:])

运行方式(终端):

python 复制代码
python demo.py hello world 123

输出:

python 复制代码
命令行参数列表: ['demo.py', 'hello', 'world', '123']
程序文件名: demo.py
传入的参数数量: 3
传入的参数: ['hello', 'world', '123']
2. 退出程序:sys.exit()

sys.exit([status]) 用于终止当前程序运行,可选参数 status 表示退出状态码(0 表示正常退出,非 0 表示异常退出)。

示例代码:

python 复制代码
import sys

print("程序开始")

# 判断条件,决定是否退出
if len(sys.argv) < 2:
    print("错误:未传入参数")
    sys.exit(1)  # 异常退出,状态码 1

print("程序正常执行完成")
sys.exit(0)  # 正常退出,状态码 0
3. Python 解释器信息
  1. sys.version:获取 Python 解释器版本信息
  2. sys.version_info:以元组形式返回版本号(主版本、次版本等)
  3. sys.platform:获取当前运行的操作系统平台(如 win32linuxdarwin 等)

示例代码:

python 复制代码
import sys

print("Python 版本:", sys.version)
print("版本号元组:", sys.version_info)
print("是否为 Python 3.6+:", sys.version_info >= (3, 6))
print("操作系统平台:", sys.platform)

输出:

python 复制代码
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.stdinsys.stdoutsys.stderr 分别表示标准输入、标准输出、标准错误流,可用于重定向输入输出。

示例:重定向打印输出到文件

python 复制代码
import sys

# 保存原始 stdout
original_stdout = sys.stdout

# 重定向到文件
with open("output.txt", "w") as f:
    sys.stdout = f
    print("这段文字会被写入文件")
    print("而不是显示在控制台")

# 恢复原始 stdout
sys.stdout = original_stdout
print("现在恢复正常输出")
5. 模块搜索路径:sys.path

sys.path 是一个列表,存储 Python 解释器搜索模块的路径。当使用 import 导入模块时,解释器会从这些路径中查找模块。

示例代码:

python 复制代码
import sys

print("模块搜索路径:")
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),可通过这两个方法查看或修改限制值。

示例代码:

python 复制代码
import sys

print("默认递归深度限制:", sys.getrecursionlimit())

# 修改递归深度限制
sys.setrecursionlimit(2000)
print("修改后的递归深度限制:", sys.getrecursionlimit())

二、综合示例

python 复制代码
import sys

def 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.stdout
    with open("temp.log", "w") as f:
        sys.stdout = f
        print("这条信息被写入到 temp.log")
    sys.stdout = original_stdout
    print("已将部分输出写入 temp.log")

    # 4. 模块搜索路径
    print("\n===== 模块搜索路径 =====")
    print(f"当前工作目录是否在搜索路径中:{os.getcwd() in sys.path}")  # 需要导入 os

    # 5. 退出程序
    print("\n程序即将退出")
    sys.exit(0)

if __name__ == "__main__":
    sys_demo()

三、注意事项

  1. sys 库与 os 库的区别:sys 主要针对 Python 解释器本身,os 主要针对操作系统交互。

  2. 命令行参数处理复杂时,建议使用 argparse 模块(基于 sys.argv 封装,更强大)。

  3. 修改 sys.path 时,建议使用临时添加(程序结束后失效),避免污染全局路径。

  4. 重定向输入输出后,记得恢复原始流,否则可能导致后续打印异常。

相关推荐
用户83562907805116 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
用户83562907805116 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
你好潘先生1 天前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
Agent_大师1 天前
WebSocket 行情重连成功,K线缺口不会自动消失
python
荣码1 天前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
copyer_xyf1 天前
FastAPI 如何连接 MySQL
后端·python
apocelipes2 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
用户8356290780512 天前
使用 Python 在 PDF 中创建与管理书签
后端·python
MeixianAgent2 天前
Python 回测数据入口怎么验?历史 K 线入库前先做 5 个检查
后端·python
咕白m6252 天前
用 Python 实现一键批量查找与替换 Excel 数据
后端·python