sys模块是Python标准库中的重要组成部分,它提供了与Python解释器交互的各种功能。通过这个模块,我们可以获取系统信息、处理命令行参数、控制程序流程等。
使用sys模块前需要先导入:
import syssys.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:命令行参数错误
其他:自定义错误代码
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.argv | 命令行参数列表,sys.argv[0] 是脚本名称 |
| sys.path | Python 模块搜索路径(PYTHONPATH) |
| sys.modules | 已加载模块的字典 |
| sys.platform | 操作系统平台标识(如 'win32', 'linux', 'darwin') |
| sys.version | Python 解释器版本信息 |
| sys.executable | Python 解释器的绝对路径 |
| sys.stdin | 标准输入流(文件对象) |
| sys.stdout | 标准输出流(文件对象) |
| sys.stderr | 标准错误流(文件对象) |
| sys.byteorder | 字节序('little' 或 'big') |
| sys.maxsize | 最大整数值(2**31-1 或 2**63-1) |
| 方法 | 说明 |
|---|---|
| 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模块提供的是底层系统接口,使用时要注意错误处理和兼容性问题。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!