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. 重定向输入输出后,记得恢复原始流,否则可能导致后续打印异常。

相关推荐
阿葱(聪)1 小时前
java 在k8s中的部署流程
java·开发语言·docker·kubernetes
路人蛃1 小时前
通过国内扣子(Coze)搭建智能体并接入discord机器人
人工智能·python·ubuntu·ai·aigc·个人开发
qiqiqi(^_×)1 小时前
卡在“pycharm正在创建帮助程序目录”
ide·python·pycharm
浮生带你学Java1 小时前
2025Java面试题及答案整理( 2025年 7 月最新版,持续更新)
java·开发语言·数据库·面试·职场和发展
Ching·2 小时前
esp32使用ESP-IDF在Linux下的升级步骤,和遇到的坑Traceback (most recent call last):,及解决
linux·python·esp32·esp_idf升级
斯是 陋室2 小时前
在CentOS7.9服务器上安装.NET 8.0 SDK
运维·服务器·开发语言·c++·c#·云计算·.net
李长渊哦2 小时前
深入理解Java中的Map.Entry接口
java·开发语言
koooo~2 小时前
JavaScript中的Window对象
开发语言·javascript·ecmascript
吗喽1543451882 小时前
用python实现自动化布尔盲注
数据库·python·自动化
hbrown2 小时前
Flask+LayUI开发手记(十一):选项集合的数据库扩展类
前端·数据库·python·layui