Python3 sys 模块及应用

🎉摘要:本文详细介绍 Python 标准库 sys 模块的使用方法。涵盖命令行参数 sys.argv、标准输入输出流、程序退出 sys.exit、模块搜索路径 sys.path 以及系统信息获取。通过代码示例演示如何获取版本信息、内存大小及综合应用,帮助开发者全面掌握 sys 模块功能。

sys 模块是 Python 标准库中一个非常重要的模块,它提供了与 Python 解释器及其环境相关的功能。通过 sys 模块,我们可以访问命令行参数、修改 Python 路径、与标准输入输出交互、获取系统信息等。

命令行参数

sys.argv 是一个列表,包含了命令行参数。其中 sys.argv[0] 是脚本名称,sys.argv[1:] 是传递给脚本的参数。例如:

import sys

# 打印所有命令行参数
print(f"脚本名称: {sys.argv[0]}")
print(f"参数数量: {len(sys.argv) - 1}")
print(f"参数列表: {sys.argv[1:]}")

运行结果:

$ python demo.py arg1 arg2 arg3 agr4
脚本名称: demo.py
参数数量: 4
参数列表: ['arg1', 'arg2', 'arg3', 'agr4']

标准输入/输出/错误流

sys 模块提供了与标准流交互的接口,如下:

  • sys.stdin:标准输入流

  • sys.stdout:标准输出流

  • sys.stderr:标准错误流

示例:

import sys

# 向标准输出写入
sys.stdout.write("这是标准输出内容\n")

# 向标准错误写入
sys.stderr.write("这是错误信息\n")

# 从标准输入读取
print("请输入一些内容:")
input_data = sys.stdin.readline()
print(f"你输入了: {input_data}")

# 重定向输出示例
original_stdout = sys.stdout  # 保存原始stdout
with open("output.txt", "w") as f:
    sys.stdout = f  # 重定向到文件
    print("这条信息会写入文件")
sys.stdout = original_stdout  # 恢复
print("这条信息会显示在控制台")

运行结果:

$ python demo.py
这是标准输出内容
这是错误信息
请输入一些内容:
hello world
你输入了: hello world

这条信息会显示在控制台

退出程序

sys.exit([arg]) 用于退出当前程序,可选参数为退出状态码(默认为 0,表示正常退出)。示例:

import sys

print("程序开始")

# 正常退出
if len(sys.argv) < 2:
    print("缺少参数,程序将退出")
    sys.exit(0)  # 0表示正常退出

# 错误退出
if sys.argv[1].isdigit():
    print("参数不能是数字")
    sys.exit(1)  # 非0表示错误退出

print("程序继续执行...")

运行结果:

$ python demo.py
程序开始
缺少参数,程序将退出

Python 路径

sys.path 是一个列表,包含了 Python 解释器查找模块的路径。示例:

import sys

# 打印所有模块搜索路径
print("Python 模块搜索路径:")
for path in sys.path:
    print(f"  {path}")

# 添加新的搜索路径
new_path = "/home/user/my_modules"
if new_path not in sys.path:
    sys.path.append(new_path)
    print(f"\n已添加新路径: {new_path}")
    print("更新后的路径列表:")
    print(sys.path)

运行结果:

$ python demo.py
Python 模块搜索路径:
  D:\$share_dir\workspace\4.learn\Python3\demo
  D:\anaconda3\python313.zip
  D:\anaconda3\DLLs
  D:\anaconda3\Lib
  D:\anaconda3
  C:\Users\Administrator\AppData\Roaming\Python\Python313\site-packages
  C:\Users\Administrator\AppData\Roaming\Python\Python313\site-packages\win32
  C:\Users\Administrator\AppData\Roaming\Python\Python313\site-packages\win32\lib
  C:\Users\Administrator\AppData\Roaming\Python\Python313\site-packages\Pythonwin
  D:\anaconda3\Lib\site-packages
  D:\anaconda3\Lib\site-packages\win32
  D:\anaconda3\Lib\site-packages\win32\lib
  D:\anaconda3\Lib\site-packages\Pythonwin

已添加新路径: /home/user/my_modules
更新后的路径列表:
['D:\\$share_dir\\workspace\\4.learn\\Python3\\demo', 'D:\\anaconda3\\python313.zip', 'D:\\anaconda3\\DLLs', 'D:\\anaconda3\\Lib', 'D:\\anaconda3', 'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python313\\site-packages', 'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python313\\site-packages\\win32', 'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python313\\site-packages\\win32\\lib', 'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python313\\site-packages\\Pythonwin', 'D:\\anaconda3\\Lib\\site-packages', 'D:\\anaconda3\\Lib\\site-packages\\win32', 'D:\\anaconda3\\Lib\\site-packages\\win32\\lib', 'D:\\anaconda3\\Lib\\site-packages\\Pythonwin', '/home/user/my_modules']

模块相关

sys.modules 是一个字典,包含了当前已导入的所有模块。示例:

import sys

# 打印已导入的模块数量
print(f"已导入的模块数量: {len(sys.modules)}")

# 打印部分已导入的模块
print("\n部分已导入的模块:")
count = 0
for module_name in sys.modules:
    if count < 10:  # 只显示前10个
        print(f"  {module_name}")
        count += 1
    else:
        break

# 检查特定模块是否已导入
module_name = "os"
if module_name in sys.modules:
    print(f"\n模块 {module_name} 已导入")
else:
    print(f"\n模块 {module_name} 未导入")

运行结果:

$ python demo.py
已导入的模块数量: 51

部分已导入的模块:
  sys
  builtins
  _frozen_importlib
  _imp
  _thread
  _warnings
  _weakref
  winreg
  _io
  marshal

模块 os 已导入

系统信息

sys 模块提供了一些获取系统和 Python 解释器信息的属性,如下:

import sys

# Python 版本信息
print(f"Python 版本: {sys.version}")
print(f"Python 版本信息元组: {sys.version_info}")
print(f"主要版本号: {sys.version_info.major}")
print(f"次要版本号: {sys.version_info.minor}")

# 操作系统信息
print(f"\n操作系统名称: {sys.platform}")

# 解释器信息
print(f"Python 解释器可执行文件路径: {sys.executable}")
print(f"当前默认的递归限制: {sys.getrecursionlimit()}")

# 修改递归限制
sys.setrecursionlimit(1500)
print(f"修改后的递归限制: {sys.getrecursionlimit()}")

运行结果:

$ python demo.py
Python 版本: 3.13.9 | packaged by Anaconda, Inc. | (main, Oct 21 2025, 19:09:58) [MSC v.1929 64 bit (AMD64)]
Python 版本信息元组: sys.version_info(major=3, minor=13, micro=9, releaselevel='final', serial=0)
主要版本号: 3
次要版本号: 13

操作系统名称: win32
Python 解释器可执行文件路径: D:\anaconda3\python.exe
当前默认的递归限制: 1000
修改后的递归限制: 1500

内存相关

sys.getsizeof() 可以获取对象占用的内存大小(以字节为单位)。示例:

import sys

# 不同对象的内存占用
print(f"整数 1 的内存大小: {sys.getsizeof(1)} 字节")
print(f"字符串 'hello' 的内存大小: {sys.getsizeof('hello')} 字节")
print(f"空列表的内存大小: {sys.getsizeof([])} 字节")
print(f"包含10个元素的列表的内存大小: {sys.getsizeof([1,2,3,4,5,6,7,8,9,10])} 字节")

# 自定义对象的内存占用
class MyClass:
    def __init__(self, x):
        self.x = x

obj = MyClass(10)
print(f"自定义对象的内存大小: {sys.getsizeof(obj)} 字节")

运行结果:

$ python demo.py
整数 1 的内存大小: 28 字节
字符串 'hello' 的内存大小: 46 字节
空列表的内存大小: 56 字节
包含10个元素的列表的内存大小: 136 字节
自定义对象的内存大小: 48 字节

其他常用功能

除了上述介绍的方法外,sys 模块还可以获取最大整数、当前线程信息等等,例如:

import sys

# 获取当前最大整数
print(f"最大整数: {sys.maxsize}")

# 获取当前线程信息
print(f"\n当前线程信息: {sys.thread_info}")

# 获取字节序信息
if sys.byteorder == 'little':
    print(f"字节序: 小端序 (little-endian)")
else:
    print(f"字节序: 大端序 (big-endian)")

# 显示Python解释器的版权信息
print("\nPython 版权信息:")
print(sys.copyright)

运行结果:

$ python demo.py
最大整数: 9223372036854775807

当前线程信息: sys.thread_info(name='nt', lock=None, version=None)
字节序: 小端序 (little-endian)

Python 版权信息:
Copyright (c) 2001-2024 Python Software Foundation.
All Rights Reserved.

Copyright (c) 2000 BeOpen.com.
All Rights Reserved.

Copyright (c) 1995-2001 Corporation for National Research Initiatives.
All Rights Reserved.

Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam.
All Rights Reserved.

综合应用

下面是一个综合使用 sys 模块的脚本,用于统计文本文件中的字符数、单词数和行数:

import sys

def file_stats(file_path):
    """统计文件的字符数、单词数和行数"""
    try:
        with open(file_path, 'r', encoding='utf-8') as file:
            lines = file.readlines()
            
        line_count = len(lines)
        char_count = sum(len(line) for line in lines)
        word_count = sum(len(line.split()) for line in lines)
        
        return {
            'file': file_path,
            'lines': line_count,
            'words': word_count,
            'chars': char_count
        }
    except FileNotFoundError:
        sys.stderr.write(f"错误: 文件 '{file_path}' 不存在\n")
        sys.exit(1)
    except Exception as e:
        sys.stderr.write(f"处理文件时出错: {str(e)}\n")
        sys.exit(1)

def main():
    # 检查命令行参数
    if len(sys.argv) < 2:
        sys.stderr.write("用法: python file_stats.py <文件名>\n")
        sys.exit(1)
    
    # 获取统计信息
    stats = file_stats(sys.argv[1])
    
    # 输出结果
    print(f"{stats['lines']} 行, {stats['words']} 单词, {stats['chars']} 字符 {stats['file']}")

if __name__ == "__main__":
    main()

运行结果:

$ python demo.py .\test.txt
4 行, 4 单词, 56 字符 .\test.txt

更多 sys 模块信息请查阅 https://docs.python.org/3/library/sys.html 参考文档。

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号