Python3入门指南Python语言的特点和实际应用Python3环境搭建配置VSCode进行Python开发Python基础语法Python变量与数据类型Python数据类型转换Python解释器使用Python注释使用Python运算符Python数字类型Python字符串操作Python列表操作Python元组使用Python字典使用Python集合使用Python条件控制详解Python循环语句详解Python编程入门实践Python推导式详解Python迭代器和生成器Python with语句详解Python函数详解Python lambda(匿名函数)Python装饰器Python数据结构Python模块和包使用Python中__name__和__main__的用法Python输入输出:从基础到文件操作Python文件操作Python OS模块使用Python错误和异常处理Python面向对象编程Python命名空间和作用域Python虚拟环境:venv详细教程Python类型注解Python标准库常用模块Python正则表达式Python CGI编程Python MySQL(mysql-connector驱动)Python MySQL(PyMySQL驱动)Python网络编程Python发送邮件Python多线程编程Python XML解析Python JSON解析Python日期和时间处理Python操作MongoDBPython urllib库使用Python uWSGI 安装与配置Python pip包管理工具Python operator模块Python math模块Python requests模块HTTP请求Python random模块Python OpenAI库Python AI绘画制作Python statistics模块Python hashlib模块:哈希加密Python量化交易Python pyecharts数据可视化Python Selenium网页自动化Python BeautifulSoup网页数据提取Python Scrapy爬虫框架Python Markdown转HTMLPython sys模块Python Pickle模块:数据存储Python subprocess模块Python queue队列模块Python StringIO内存文件操作Python logging日志记录Python datetime日期时间处理Python re正则表达式Python csv表格数据处理Python threading 多线程编程Python asyncio 异步编程Python PyQt 图形界面开发Python 应用方向和常用库框架

Python sys模块

sys模块是Python标准库中的重要组成部分,它提供了与Python解释器交互的各种功能。通过这个模块,我们可以获取系统信息、处理命令行参数、控制程序流程等。


导入sys模块

使用sys模块前需要先导入:

import sys


处理命令行参数

获取脚本参数

sys.argv可以获取运行Python脚本时传递的参数:

import sys

# 显示所有参数
print("脚本名称:", sys.argv[0])

if len(sys.argv) > 1:
    print("传递的参数:")
    for i, arg in enumerate(sys.argv[1:], 1):
        print(f"  参数{i}: {arg}")
else:
    print("没有传递额外参数")

保存为test.py,然后运行:

python test.py hello world 123

输出结果:

脚本名称: test.py
传递的参数:
  参数1: hello
  参数2: world
  参数3: 123

实际应用示例

创建一个处理文件的脚本:

import sys
import os

def process_files():
    """处理命令行传入的文件"""
    if len(sys.argv) < 2:
        print("用法: python script.py <文件1> <文件2> ...")
        sys.exit(1)
    
    for filename in sys.argv[1:]:
        if os.path.exists(filename):
            print(f"处理文件: {filename}")
            # 这里可以添加实际的文件处理代码
        else:
            print(f"文件不存在: {filename}")

if __name__ == "__main__":
    process_files()


程序退出控制

正常退出和错误退出

import sys

def check_requirements():
    """检查运行要求"""
    import os
    
    # 检查必要文件
    if not os.path.exists('config.txt'):
        print("错误: 缺少配置文件 config.txt")
        sys.exit(1)  # 非零表示错误退出
    
    # 检查Python版本
    if sys.version_info < (3, 6):
        print("错误: 需要Python 3.6或更高版本")
        sys.exit(1)
    
    print("所有检查通过,程序继续运行")
    # 程序正常执行...
    sys.exit(0)  # 零表示成功退出

check_requirements()

退出状态码的含义

  • 0:程序成功完成

  • 1:一般错误

  • 2:命令行参数错误

  • 其他:自定义错误代码


系统信息获取

Python版本信息

import sys

print("Python版本:", sys.version)
print("版本详细信息:", sys.version_info)
print("主版本号:", sys.version_info.major)
print("次版本号:", sys.version_info.minor)
print("微版本号:", sys.version_info.micro)

# 检查Python版本
if sys.version_info >= (3, 8):
    print("支持Python 3.8+的特性")
else:
    print("需要升级Python版本")

平台信息

import sys

print("操作系统平台:", sys.platform)
print("Python解释器路径:", sys.executable)
print("最大整数值:", sys.maxsize)

# 根据平台执行不同操作
if sys.platform.startswith('win'):
    print("运行在Windows系统")
elif sys.platform.startswith('linux'):
    print("运行在Linux系统")
elif sys.platform == 'darwin':
    print("运行在macOS系统")
else:
    print("运行在其他系统")


模块和路径管理

查看模块搜索路径

import sys

print("模块搜索路径:")
for i, path in enumerate(sys.path):
    print(f"{i+1:2d}. {path}")

# 添加自定义路径
custom_path = "/my/custom/module/path"
if custom_path not in sys.path:
    sys.path.append(custom_path)
    print(f"已添加路径: {custom_path}")

查看已加载模块

import sys

# 查看所有已加载的模块
print(f"已加载 {len(sys.modules)} 个模块")

# 查看特定模块信息
if 'os' in sys.modules:
    print("os模块已加载")
    print("os模块位置:", sys.modules['os'])

# 查看内置模块
builtin_modules = [name for name in sys.builtin_module_names]
print("内置模块:", builtin_modules[:10])  # 显示前10个


输入输出流控制

重定向输出

import sys

def redirect_output():
    """重定向标准输出到文件"""
    original_stdout = sys.stdout  # 保存原始输出
    
    try:
        # 重定向到文件
        with open('output.log', 'w', encoding='utf-8') as f:
            sys.stdout = f
            print("这行内容写入文件")
            print("当前时间:", __import__('datetime').datetime.now())
        
        # 恢复标准输出
        sys.stdout = original_stdout
        print("这行内容显示在控制台")
        
    except Exception as e:
        # 确保总是恢复输出
        sys.stdout = original_stdout
        print(f"错误: {e}")

redirect_output()

自定义错误输出

import sys

class ColorOutput:
    """带颜色的输出类"""
    def __init__(self, file):
        self.file = file
        self.colors = {
            'red': '\033[91m',
            'green': '\033[92m',
            'yellow': '\033[93m',
            'blue': '\033[94m',
            'reset': '\033[0m'
        }
    
    def write(self, text):
        # 根据关键词添加颜色
        if '错误' in text:
            text = self.colors['red'] + text + self.colors['reset']
        elif '警告' in text:
            text = self.colors['yellow'] + text + self.colors['reset']
        elif '成功' in text:
            text = self.colors['green'] + text + self.colors['reset']
        
        self.file.write(text)
    
    def flush(self):
        self.file.flush()

# 使用自定义错误输出
sys.stderr = ColorOutput(sys.stderr)

print("正常信息")
print("错误信息: 文件未找到")  # 这会显示为红色
print("警告信息: 内存不足")    # 这会显示为黄色
print("成功信息: 操作完成")    # 这会显示为绿色


内存和性能相关

查看对象内存占用

import sys

def show_memory_usage():
    """显示各种对象的内存占用"""
    objects = [
        100,                    # 整数
        3.14159,               # 浮点数
        "Hello, World!",       # 字符串
        [1, 2, 3, 4, 5],      # 列表
        {'a': 1, 'b': 2},     # 字典
        (1, 2, 3),            # 元组
        set([1, 2, 3]),       # 集合
    ]
    
    print("对象内存占用:")
    for obj in objects:
        size = sys.getsizeof(obj)
        print(f"  {type(obj).__name__:10} {str(obj):20} -> {size:4} 字节")

show_memory_usage()

引用计数

import sys

def demonstrate_refcount():
    """演示引用计数"""
    a = [1, 2, 3]  # 创建对象,引用计数为1
    print(f"创建列表后引用计数: {sys.getrefcount(a)}")
    
    b = a  # 增加一个引用
    print(f"赋值后引用计数: {sys.getrefcount(a)}")
    
    c = [a, a]  # 增加两个引用
    print(f"放入容器后引用计数: {sys.getrefcount(a)}")
    
    del b  # 删除一个引用
    print(f"删除引用后引用计数: {sys.getrefcount(a)}")

demonstrate_refcount()


递归深度控制

调整递归限制

import sys

def recursive_function(n, depth=0):
    """递归函数示例"""
    if depth > 10:  # 安全限制
        return
    if n <= 0:
        return 1
    return n * recursive_function(n-1, depth+1)

def test_recursion_limit():
    """测试递归深度限制"""
    original_limit = sys.getrecursionlimit()
    print(f"当前递归深度限制: {original_limit}")
    
    try:
        # 尝试深度递归
        sys.setrecursionlimit(50)  # 设置较小的限制
        print(f"新递归深度限制: {sys.getrecursionlimit()}")
        
        # 这会触发递归错误
        recursive_function(100)
        
    except RecursionError as e:
        print(f"递归错误: {e}")
    
    finally:
        # 恢复原始限制
        sys.setrecursionlimit(original_limit)
        print(f"已恢复递归限制: {sys.getrecursionlimit()}")

test_recursion_limit()


编码和字节序

系统编码信息

import sys

def show_encoding_info():
    """显示编码相关信息"""
    print("默认编码:", sys.getdefaultencoding())
    print("文件系统编码:", sys.getfilesystemencoding())
    print("字节序:", sys.byteorder)  # 'little' 或 'big'
    
    # 检查Unicode支持
    if sys.maxunicode > 65535:
        print("使用UCS-4编码(支持所有Unicode字符)")
    else:
        print("使用UCS-2编码(支持基本多文种平面)")

show_encoding_info()


实际应用场景

配置检查脚本

import sys
import os

def system_check():
    """系统环境检查"""
    checks_passed = True
    
    print("=== 系统环境检查 ===")
    
    # 检查Python版本
    if sys.version_info < (3, 7):
        print("❌ 需要Python 3.7或更高版本")
        checks_passed = False
    else:
        print("✅ Python版本符合要求")
    
    # 检查平台
    if sys.platform not in ['win32', 'linux', 'darwin']:
        print("⚠️  未知的操作系统平台")
    else:
        print(f"✅ 平台支持: {sys.platform}")
    
    # 检查内存
    import psutil
    memory = psutil.virtual_memory()
    if memory.total < 4 * 1024 * 1024 * 1024:  # 4GB
        print("⚠️  内存可能不足")
    else:
        print("✅ 内存充足")
    
    # 检查必要模块
    required_modules = ['requests', 'numpy', 'pandas']
    for module in required_modules:
        try:
            __import__(module)
            print(f"✅ 模块 {module} 可用")
        except ImportError:
            print(f"❌ 缺少模块 {module}")
            checks_passed = False
    
    return checks_passed

if __name__ == "__main__":
    if system_check():
        print("\n所有检查通过,程序可以运行")
        sys.exit(0)
    else:
        print("\n存在环境问题,请解决后重试")
        sys.exit(1)

命令行工具框架

import sys
import argparse

def create_cli_tool():
    """创建命令行工具"""
    
    if len(sys.argv) == 1:
        print("用法:")
        print("  python tool.py --help 查看帮助")
        print("  python tool.py process <文件> 处理文件")
        print("  python tool.py info 显示系统信息")
        sys.exit(1)
    
    command = sys.argv[1]
    
    if command == 'info':
        show_system_info()
    elif command == 'process' and len(sys.argv) > 2:
        process_file(sys.argv[2])
    else:
        print(f"未知命令: {command}")
        sys.exit(1)

def show_system_info():
    """显示系统信息"""
    print("系统信息:")
    print(f"  Python版本: {sys.version.split()[0]}")
    print(f"  平台: {sys.platform}")
    print(f"  可执行文件: {sys.executable}")
    print(f"  默认编码: {sys.getdefaultencoding()}")

def process_file(filename):
    """处理文件"""
    if not os.path.exists(filename):
        print(f"文件不存在: {filename}")
        sys.exit(1)
    
    print(f"处理文件: {filename}")
    # 实际的文件处理逻辑...

if __name__ == "__main__":
    create_cli_tool()


调试和错误处理

异常信息获取

import sys

def safe_division(a, b):
    """安全的除法运算"""
    try:
        return a / b
    except Exception:
        # 获取异常信息
        exc_type, exc_value, exc_traceback = sys.exc_info()
        print(f"异常类型: {exc_type.__name__}")
        print(f"异常信息: {exc_value}")
        return None

# 测试异常处理
result = safe_division(10, 0)
print(f"结果: {result}")


sys 模块常用属性

属性说明
sys.argv命令行参数列表,sys.argv[0] 是脚本名称
sys.pathPython 模块搜索路径(PYTHONPATH)
sys.modules已加载模块的字典
sys.platform操作系统平台标识(如 'win32', 'linux', 'darwin')
sys.versionPython 解释器版本信息
sys.executablePython 解释器的绝对路径
sys.stdin标准输入流(文件对象)
sys.stdout标准输出流(文件对象)
sys.stderr标准错误流(文件对象)
sys.byteorder字节序('little' 或 'big')
sys.maxsize最大整数值(2**31-1 或 2**63-1)

sys 模块常用方法

方法说明
sys.exit([status])退出程序,status=0 表示正常退出
sys.getsizeof(obj)返回对象占用的内存字节数
sys.getdefaultencoding()获取默认字符串编码(通常 'utf-8')
sys.setrecursionlimit(limit)设置递归深度限制(默认 1000)
sys.getrecursionlimit()获取当前递归深度限制
sys.getrefcount(obj)返回对象的引用计数
sys.exc_info()获取当前异常信息((type, value, traceback))
sys.settrace(tracefunc)设置调试跟踪函数
sys.setprofile(profilefunc)设置性能分析函数

总结

sys模块提供了丰富的系统级功能:

  • 命令行处理:获取脚本参数

  • 程序控制:退出程序和控制流程

  • 系统信息:版本、平台、路径信息

  • 输入输出:重定向标准流

  • 内存管理:查看内存使用和引用计数

  • 性能调优:控制递归深度

这些功能在以下场景中特别有用:

  • 开发命令行工具

  • 系统环境检查

  • 性能分析和调试

  • 跨平台应用开发

记住,sys模块提供的是底层系统接口,使用时要注意错误处理和兼容性问题。

本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!

链接: https://fly63.com/course/36_2137

目录选择