python中的sys库基础知识点

sys 是 Python 标准库中的一个重要模块,它提供了访问与 Python 解释器紧密相关的变量和函数的途径,以下是关于 sys 库的一些常见知识点及示例说明:

1. 命令行参数获取

知识点:sys.argv 用于获取命令行参数列表,其中 sys.argv[0] 是脚本自身的名称,从 sys.argv[1] 开始是传递给脚本的其他参数。
示例:

import sys

print("脚本名称:", sys.argv[0])
if len(sys.argv) > 1:
    print("传递的参数:", sys.argv[1:])
else:
    print("未传递额外参数。")

假设上述代码保存为 test.py,在命令行运行 python test.py arg1 arg2,输出将会是:

脚本名称: test.py
传递的参数: ['arg1', 'arg2']

2. 退出程序

知识点:sys.exit() 函数用于退出当前程序。可以传入一个整数参数作为退出状态码(通常 0 表示正常退出,非 0 表示异常退出)。
示例:

import sys

print("程序开始执行")
sys.exit(0)
print("此句不会被执行,因为程序已退出")

运行上述代码,只会输出 程序开始执行,然后程序就会终止,不会执行后面的 print 语句。

3. 获取系统相关信息

知识点:
sys.platform:返回当前运行 Python 的操作系统平台名称,如 ‘win32’(Windows)、‘linux’、‘darwin’(Mac OS)等。
sys.version:获取 Python 解释器的版本信息字符串。
sys.version_info:以命名元组的形式返回 Python 解释器的版本信息,可方便地通过属性访问主版本号、次版本号等。
示例:

import sys

print("操作系统平台:", sys.platform)
print("Python版本信息(字符串):", sys.version)
print("Python主版本号:", sys.version_info.major)

print(“Python次版本号:”, sys.version_info.minor)

4. 标准输出和标准输入重定向

知识点:
sys.stdout 是标准输出流对象,默认指向控制台输出。可以通过将其重新赋值来实现输出重定向。
sys.stdin 是标准输入流对象,用于读取用户在控制台的输入。同样可以进行一些操作来改变输入的来源等(相对较少用这种方式进行复杂操作)。
示例:

import sys

# 将标准输出重定向到文件
original_stdout = sys.stdout
with open('output.txt', 'w') as f:
    sys.stdout = f
    print("这行内容将会被写入到output.txt文件中")
sys.stdout = original_stdout

# 从标准输入读取
print("请输入内容:")
user_input = sys.stdin.readline()
print("你输入的内容是:", user_input.strip())

在上述示例中,首先将标准输出重定向到 output.txt 文件,然后又恢复到原来的控制台输出状态,接着通过标准输入读取了用户输入的一行内容并进行了输出。

5. 模块搜索路径

知识点:sys.path 是一个列表,包含了 Python 解释器在导入模块时搜索的路径。可以通过修改这个列表来添加自定义的模块搜索路径。
示例:

import sys
import os

# 当前目录下假设创建了一个名为'my_module'的自定义模块文件夹,里面有个'module_file.py'文件
current_dir = os.getcwd()
sys.path.append(current_dir)

import my_module.module_file
# 这里假设'module_file.py' 中有个函数叫'my_function'
my_module.module_file.my_function()

通过将当前目录添加到 sys.path,就可以让 Python 解释器能够找到并导入位于当前目录下的自定义模块。
这些只是 sys 库的一些常见用法,它在与系统交互、控制程序执行流程以及处理输入输出等方面都发挥着重要作用。

6. 获取已加载模块的字典

知识点:sys.modules 是一个字典,它包含了当前 Python 会话中已经加载的所有模块的信息。键是模块名,值是对应的模块对象。
示例:

import sys
import math

print("已加载的模块字典:", sys.modules)
print("math模块是否已加载:", 'math' in sys.modules)

运行上述代码,会输出当前会话中已加载的所有模块的字典信息,并且可以通过键来判断特定模块(如 math)是否已经被加载。

7. 设置递归深度限制

知识点:sys.setrecursionlimit() 函数用于设置 Python 解释器的递归深度限制。默认情况下,递归深度是有一定限制的,如果递归函数调用层次过深可能会导致 RecursionError。通过这个函数可以根据需要调整限制。
示例:

import sys

# 设置递归深度限制为一个较大的值
sys.setrecursionlimit(10000)

def recursive_function(n):
    if n <= 0:
        return
    recursive_function(n - 1)

recursive_function(5000)  # 现在可以进行较深的递归调用而不会轻易报错

在上述示例中,先将递归深度限制设置为 10000,然后定义了一个递归函数并进行了相对较深的递归调用。

8. 获取递归深度限制

知识点:sys.getrecursionlimit() 函数用于获取当前 Python 解释器设置的递归深度限制值。
示例:

print("当前递归深度限制:", sys.getrecursionlimit())

运行上述代码,会直接输出当前 Python 解释器所设置的递归深度限制的值。

9. 最大整数值和最小整数值

知识点:
sys.maxsize:表示当前平台上能表示的最大整数(有符号整数的最大值)。
sys.maxunicode:表示当前平台上能表示的最大 Unicode 码点值。
示例:

import sys

print("当前平台最大整数:", sys.maxsize)
print("当前平台最大Unicode码点值:", sys.maxunicode)

运行上述代码,可分别得到当前平台上的最大整数和最大 Unicode 码点值的相关信息。

10. 内存查看相关(近似值)

知识点:sys.getsizeof() 函数用于获取一个对象占用的内存字节数(注意这只是一个近似值,实际内存管理可能更复杂)。
示例:

import sys

my_list = [1, 2, 3, 4, 5]
print("列表对象占用内存字节数:", sys.getsizeof(my_list))

运行上述代码,会输出给定列表对象在内存中大致占用的字节数。

11. 字节序信息

知识点:sys.byteorder 用于表示当前平台的字节序,取值为 ‘little’(小端序)或 ‘big’(大端序)。在处理二进制数据等场景下会用到这个信息。
示例:

import sys

print("当前平台字节序:", sys.byteorder)

运行上述代码,可得知当前平台的字节序是小端序还是大端序。

12. 执行外部命令(有限制且不推荐用于复杂情况)

知识点:sys.executable 是当前运行的 Python 解释器的可执行文件路径。结合 os.system() 等函数可以在 Python 程序中执行外部命令(但这种方式有一定局限性且可能存在安全隐患,更推荐使用 subprocess 模块来执行外部命令)。
示例:

import sys
import os

python_executable = sys.executable
os.system(python_executable + " -c 'print(\"Hello from another Python process\")'")

在上述示例中,通过获取当前 Python 解释器的可执行文件路径,然后利用 os.system() 函数执行了一个简单的外部命令,即在另一个短暂启动的 Python 进程中打印一句话。

13. 跟踪信息输出控制

知识点:sys.tracebacklimit 用于设置在发生异常时输出的跟踪信息的最大行数。默认值通常是 1000,可以根据需要调整这个值来控制异常时显示的详细程度。
示例:

import sys

sys.tracebacklimit = 5

try:
    1 / 0
except ZeroDivisionError as e:
    print("发生异常:", e)

在上述示例中,将 sys.tracebacklimit 设置为 5,当发生 ZeroDivisionError 时,只会输出最多 5 行的异常跟踪信息。

14. 可执行文件类型(特定平台相关)

知识点:sys.atexit.register() 函数用于注册一个函数,该函数将在程序正常退出时被执行。这在进行一些清理工作(如关闭文件、释放资源等)时非常有用。
示例:

import sys

def cleanup_function():
    print("执行清理操作,程序即将正常退出。")

sys.atexit.register(cleanup_function)

print("程序正常运行中...")

运行上述代码,当程序正常运行结束时,会先执行 cleanup_function,然后退出程序,输出类似于:

程序正常运行中...
执行清理操作,程序即将正常退出。

15. 检查模块是否可导入(部分平台支持)

知识点:sys.can_import() (在某些平台上可能有不同的实现或名称,部分 Python 版本可能不支持)可以用来检查一个模块是否能够被导入,它会返回一个布尔值。
示例:

import sys

print("能否导入math模块:", sys.can_import('math'))

运行上述代码,会根据当前系统和 Python 版本的情况,返回是否能够导入 math 模块的判断结果(在支持该功能的情况下)。

16. 引用计数查看(CPython 特定)

知识点:在 CPython 解释器中,sys.getrefcount() 函数可以用来查看一个对象的引用计数。引用计数是 CPython 管理内存的一种方式,当引用计数为 0 时,对象会被回收。但要注意,调用这个函数本身会增加对象的引用计数一次,所以看到的结果比实际值多 1。
示例:

import sys

my_list = [1, 2, 3]
print("列表对象的引用计数:", sys.getrefcount(my_list))

运行上述代码,会输出给定列表对象的引用计数(实际值比显示值少 1)。

17. 与 Python 内部运行机制相关(高级)

知识点:sys.getprofile() 和 sys.setprofile() 函数与 Python 的代码执行监控机制相关。sys.getprofile() 可以获取当前设置的代码执行监控函数,sys.setprofile() 则可以设置一个函数来监控代码执行的各种情况,如函数调用、返回等,不过这属于较为高级的用法,通常用于性能分析和调试等场景。
示例:

import sys

def my_profile_function(frame, event, arg):
    if event == 'call':
        print(f"调用函数:{frame.f_code.co_name}")
    elif event == 'return':
        print(f"返回函数:{frame.f_code.co_name}")

sys.setprofile(my_profile_function)

def test_function():
    print("在测试函数内部")

test_function()

sys.setprofile(None)

在上述示例中,通过设置 my_profile_function 为代码执行监控函数,当调用 test_function 时,会输出函数的调用和返回情况。

18. 特定于平台的扩展模块路径(高级)

知识点:sys.extensions (在某些版本和平台上存在)是一个列表,包含了 Python 解释器所支持的特定于平台的扩展模块的路径。这些扩展模块通常是用 C 或其他语言编写的,用于增强 Python 的功能。
示例:

import sys

print("特定于平台的扩展模块路径:", sys.extensions)

运行上述代码,在支持该功能的版本和平台上,会输出相关的扩展模块路径信息。

19. 与动态加载模块相关(高级)

知识点:sys.meta_path 是一个列表,它包含了 Python 解释器用于动态加载模块的各种查找器和加载器。这涉及到 Python 的动态加载机制,对于深入理解模块导入过程和开发一些特殊的模块加载场景(如自定义模块加载器)非常有用。
示例:

import sys

print("模块动态加载的查找器和加载器列表:", sys.meta_path)

运行上述代码,会输出当前 Python 解释器用于动态加载模块的查找器和加载器列表。

20. 调整 Python 内部的运行状态(高级)

知识点:sys.settrace() 与 sys.gettrace() 函数类似,也是与 Python 内部运行机制相关的函数。sys.settrace() 可以设置一个函数来跟踪代码执行的详细情况,包括每一行代码的执行情况,通常用于非常精细的性能分析和调试等场景。
示例:

import sys

def my_trace_function(frame, event, arg):
    if event == 'line':
        print(f"执行到代码行:{frame.f_code.co_name}:{frame.f_lineno}")

sys.settrace(my_trace_function)

def test_function():
    print("在测试函数内部")

test_function()

sys.settrace(None)

在上述示例中,通过设置 my_trace_function 为跟踪函数,当执行 test_function 时,会输出每一行代码的执行情况。

以上20个知识点加深了对 sys 库的理解和应用,涵盖了从系统信息获取、程序控制到与 Python 内部运行机制相关的内容等多个方面。不过,其中一些知识点属于较为高级的用法,可能在特定的开发场景和需求下才会用到。

作者:iiiiheng

物联沃分享整理
物联沃-IOTWORD物联网 » python中的sys库基础知识点

发表回复