python3.6sysos_python模块之sys

本文深入探讨了Python解释器的工作原理,包括sys模块的功能、命令行参数处理、异常处理、内存管理、线程切换、模块导入机制以及与操作系统交互的特性。详细解析了sys模块的属性和方法,如sys.argv、sys.argv[0]、sys.exit、sys.path、sys.maxsize等,帮助开发者更好地理解和利用Python的内部机制。
摘要由CSDN通过智能技术生成

sys模块提供对由解释器使用或维护的某些变量、与解释器交互的函数的访问接口。

sys.abiflags

在使用标准configure脚本构建python的POSIX系统上,该属性包含了PEP 3149中规定的ABI标志。

sys.argv

传递给python脚本的命令行参数列表。argv[0]表示脚本名称(是不是完成路径名取决于操作系统)。如果命令使用-c选项执行,argv[0]表示字符串-c。如果命令行没有指定脚本名称,argv[0]为空字符串。

sys.base_exec_prefix

sys.base_prefix

sys.byteorder

本机字节顺序的指示符。大尾平台上值是"big",小尾平台上值是"little"

sys.builtin_module_names

编译到python编译器的所有模块的名称的字符串列表

sys.call_tracing(func, args)

sys.copyright

返回与python解释器有关的版权信息

sys._clear_type_cache()

清除内部类型缓存。类型缓存用于加速属性、方法查找。仅在引用泄露调试期间删除不必要的引用时使用。

此函数应仅用于内部和专用用途

sys._current_frames()

返回函数调用时,每个线程标识符与该线程中处于活动状态的顶层堆栈帧的字典映射。traceback模块中的函数可以通过给定这样的帧构建调用堆栈。

这对于调试死锁是非常有用的:此函数不需要死锁线程的合作,而且只要它们保持死锁状态,调用堆栈都将被冻结。到调用代码检查帧时,非死锁线程返回的帧可能与该线程的当前活动没有关系。

此函数应仅用于内部和专用用途

sys.breakpointhook()

sys._debugmallocstats()

打印CPython内存分配器状态的低级信息到stderr。

如果python构建使用了-with-pydebug配置,此方法还会执行一些昂贵的内部一致性检查

此方法特定于CPython解释器使用

sys.dllhandle

指定python DLL句柄的整数,仅在windows平台可用

sys.displayhook(value)

sys.dont_write_bytecode

如果值为True,导入源模块时python将不会写入.pyc文件。该值初始化设置为True或False,取决于命令行选项-B以及PYTHONDONTWRITEBYTECODE环境变量,用户可以通过设置值来控制字节码文件的生成

sys.excepthook(type, value, traceback)

sys.__breakpointhook__; sys.__displayhook__; sys.__excepthook__

sys.exc_info()

返回三个值的元组,它们提供有关当前正在处理的异常的信息。返回的信息特定于当前线程以及当前堆栈帧。如果当前堆栈帧无异常处理,则信息来自正在调用的堆栈帧或堆栈帧的调用者,等等,直到发现正在处理异常的堆栈帧。这里的“处理异常”指的是执行except子句。对于任何堆栈帧而言,只能访问当前正处理的异常的信息

如果堆栈中的任何地方都无异常处理,返回包含3个None值的元组。否则返回包含(type, value, traceback)的元组。type指当前正处理的异常的类型,value指异常实例,traceback获取一个追踪对象,它封装了异常最初发生的地方的调用堆栈

sys.exec_prefix

sys.executable

返回python解释器的可执行二进制文件的绝对路径。如果python无法获取其真实路径,返回空字符串或None

sys.exit([arg])

退出python。此方法实际上是通过抛出SystemExit异常实现的,因此try语句中finally子句的清理操作仍会得到执行,且能在外层拦截退出意图

import sys

try:

sys.exit(1)

except SystemExit:

print("catch exception...")

finally:

print("cleanup action...")

可选参数arg说明退出状态(默认为0),可以是整数,也可以是其他类型的对象。如果是整数,0视为"成功终止",任何非零整数都将视为"异常终止"。大多数系统要求其范围在0-127之间,否则可能产生不确定的结果。Unix程序通常用2表示命令行语法错误,1表示其他所有异常。如果传入了非整型对象,None等同0,其他对象都等同1,且会被打印到stderr。sys.exit("some error message")是错误发生时快速退出程序的一种方法。

因为exit()基本上只是抛出异常,当在主线程中调用它且没有捕获异常时,它仅会退出程序

sys.flags

sys.float_info

sys.float_repr_style

sys.getallocatedblocks()

返回解释器当前分配的内存块数量。主要用于追踪和调试内存泄漏。受解释器内部缓存影响,每次调用返回的值都可能不一样,可以通过调用_clear_type_cache()和gc.collect()方法获取更可预测的结果。

出于某些原因,这个值可能无法计算,将返回0

sys.getandroidapilevel()

返回安卓API版本的构建时间,以整数表示。仅适用于安卓平台

sys.getcheckinterval()

返回解释器的检查间隔。在3.2版本中被getswitchinterval()替代

sys.getdefaultencoding()

Unicode使用的默认字符编码名称

sys.getdlopenflags()

sys.getfilesystemencoding()

文件名的Unicode形式和字节形式相互转换使用的编码名称。为了更好的兼容性,在所有情况下都应该使用字符串形式的文件名,尽管也支持字节形式。接收或返回文件名的函数应该支持str或bytes类型并在内部转换为系统偏向的展示格式。

返回的编码总是兼容ASCII

os.fsencode()和os.fsdecode()使用此方法返回的编码进行编解码处理

在UTF-8模式下,任何平台都返回"utf-8"

在Mac OS X平台,返回"utf-8"

在Unix平台,返回语言环境编码(locale encoding)

在Windows平台,取决于用户配置,返回"utf-8"或"mbcs"

sys.getfilesystemencodeerrors()

文件名的Unicode形式和字节形式相互转换使用的错误模式。

sys.getrefcount(object)

返回object的引用次数,通常高于期待值,因为包含了object作为参数传递给此方法的临时引用

sys.getrecursionlimit()

python解释器堆栈当前设置的最大递归深度,可以通过setrecursionlimit()设置。

sys.getsizeof(object[, default])

返回任意对象的字节大小。所有的内置对象都能返回正确的结果,但对于第三方扩展不一定适用。

Only the memory consumption directly attributed to the object is accounted for, not the memory consumption of objects it refers to.

对于未提供获取大小的方式的对象,返回default。如果未提供default,抛出TypeError异常。

getsizeof()函数调用对象的__sizeof__方法,如果对象由垃圾回收器管理,还会计算额外的垃圾回收器开销

sys.getswitchinterval()

返回解释器的线程切换间隔

sys._getframe([depth])

sys.getprofile()

sys.gettrace()

sys.getwindowsversion()

返回描述当前运行的Windows版本信息的命名元组。命名的元素是major, minor, build, platform, service_pack, service_pack_minor, service_pack_major, suite_mask, product_type和platform_version。

service_pack是一个字符串,platform_version是一个长度为3的元组,其他元素的值都是整数。各个元素还可以通过名称访问,比如sys.getwindowsversion()[0]等同于sys.getwindowsversion().major(仅前5个元素可通过下标访问)。

platform的值为2(VER_PLATFORM_WIN32_NT)

product_type的值为下列中的一个:

bVbify1?w=768&h=138

platform_version返回当前操作系统的精确major版本、minor版本和版本号(build number)。

>>> import sys

>>> sys.getwindowsversion()

sys.getwindowsversion(major=10, minor=0, build=17134, platform=2, service_pack='')

>>> sys.getwindowsversion().platform_version

(10, 0, 17134)

sys.get_asyncgen_hooks()

sys.get_coroutine_origin_tracking_depth()

sys.get_coroutine_wrapper()

sys.hash_info

sys.hexversion

编码为单个整数的版本号。每个版本都保证会增加,包括对非生产版本的支持。测试python解释器版本是否在1.5.2以上的示例:

if sys.hexversion >= 0x010502F0:

# use some advanced feature

...

else:

# use an alternative implementation or warn the user

...

之所以称其为hexversion,是因为它仅在传递给hex()函数返回十六进制的结果时才看起来有意义。使用sys.version_info可以显示更人性化的相同信息。

>>> sys.version_info

sys.version_info(major=3, minor=7, micro=0, releaselevel='final', serial=0)

>>> sys.hexversion

50790640

>>> hex(sys.hexversion)

'0x30700f0'

hexversion是一个具有以下布局的32位数字:

bVbifzA?w=1118&h=229

因此2.1.0a3是hexversion0x020100a3

sys.implementation

当前运行的python解释器的实现信息。下列属性在不同的python实现上都存在:

name:实现标识符,比如"cpython"。

version:具有同sys.version_info相同的格式,表示python实现的版本。对于Cpython来说,sys.implementation.version和sys.version_info值相同。

hexversion:python实现版本的十六进制格式,类似sys.hexversion

cache_tag:缓存模块的文件名中使用导入机制的标记。按照惯例,它的值是实现名称和版本的组合,比如"cpython-33"。然而python实现也可能使用其他合适的值。如果值为None,表示禁用了模块缓存

sys.implementation可能包含特定python实现的额外属性。非标准属性必须以"_"开头。无论其内容如何,​​sys.implementation都不会在解释器运行期间或实现版本之间发生变化

sys.int_info

保存python整数的内部表示的结构序列。属性只读:

bits_per_digit:number of bits held in each digit. Python integers are stored internally in base 2**int_info.bits_per_digit

sizeof_digit:size in bytes of the C type used to represent a digit

sys.__interactivehook__

sys.intern(string)

sys.is_finalizing()

如果python解释器正在关闭,返回True。

sys.last_type; sys.last_value; sys.last_traceback

这三个属性并不一定存在,它们在异常未被处理且解释器打印异常的错误信息以及堆栈跟踪后才被设置。它们的用途在于允许交互式用户导入调试器模块并进行post-mortem调试而无需重新执行导致异常的代码。

它们的含义与sys.exc_info()返回值的含义相同。

>>> sys.last_traceback

>Traceback (most recent call last):

File "", line 1, in

AttributeError: module 'sys' has no attribute 'last_traceback'

>>> raise Exception("throw")

Traceback (most recent call last):

File "", line 1, in

Exception: throw

>>> sys.last_type

>>> sys.last_value

Exception('throw',)

>>> sys.last_traceback

sys.maxsize

Py_ssize_t类型的变量可接受的最大整数值。通常在32位平台上是2 ** 31 - 1,在64位平台上是2 ** 63 - 1

sys.maxunicode

Unicode码表可接受的最大整数位(1114111或"0x10FFFF")

sys.meta_path

sys.modules

映射已导入的模块名和模块的字典对象。可操作此属性实现强制重新加载模块等。不过替换字典对象不一定能实现预期效果,删除基本项也可能造成python错误

sys.path

说明模块搜索路径的字符串列表。初始化自环境变量PYTHONPATH以及依赖于安装的默认值。

sys.path在程序启动时初始化,sys.path[0]表示启用python解释器的脚本所在的目录。如果该目录不可用(比如解释器是通过交互式调用的,或脚本读取自标准输入),则sys.path[0]为空字符串,表示python优先在当前工作目录搜索模块。

程序可以自由地修改sys.path列表。只有字符串和字节序列形式的路径才生效,其他类型都将被忽略。

Note:脚本目录在环境变量PYTHONPATH之前插入sys.path。

sys.path_hooks

sys.path_importer_cache

sys.platform

表示平台标识符的字符串。可用于添加特定于平台的组件到sys.path中,或其他用途。

对于Unix系统(Linux除外),它的值是uname -s指令返回的OS名称的小写格式与uname -r指令返回的版本信息的第一部分的组合,如sunos5或freebsd8。除非是针对特定的系统版本,推荐使用如下方式:

if sys.platform.startswith('freebsd'):

# FreeBSD-specific code here...

elif sys.platform.startswith('linux'):

# Linux-specific code here...

其他系统对应的值:

Linux: 'linux'

Windows: 'win32'

Windows/Cygwin: 'cygwin'

Mac OS X:'darwin'

3.3版本改动:Linux系统上,sys.platform的值将由'linux'替代'linux2'或'linux3',不再包含主版本。推荐使用上面的startswith,因为能够兼容老版本的python代码。

sys.prefix

sys.ps1; sys.ps2

python解释器的首要、次要提示符。仅在交互模式下被定义,初始值分别是>>>和...

sys.setcheckinterval(interval)

自3.2版本弃用。该函数不再有效,因为重写了线程切换和异步任务的内在逻辑。使用setswitchinterval()替代

sys.setprofile(profilefunc)

sys.setrecursionlimit(limit)

设置python解释器堆栈的最大深度为limit。可避免无限递归导致的堆栈溢出和python崩溃。

最大递归深度依赖于平台。当程序需要且平台也能提供更大深度的递归支持时,用户可以设置更大的limit值。

如果limit值设置的过小不能满足当前递归深度要求时,将抛出RecursionError异常

sys.setswitchinterval(interval)

设置解释器的线程切换间隔(单位为秒,浮点类型)。interval确定分配给并发运行的python线程的"timesices"的理想持续时间。实际值可以设置的更高,尤其是使用长时间运行的内部函数或方法。

interval时间结束后的线程调度由操作系统决定,而不是解释器。

sys.settrace(tracefunc)

sys.set_asyncgen_hooks(firstiter, finalizer)

sys.set_coroutine_origin_tracking_depth(depth)

sys.set_coroutine_wrapper(wrapper)

sys._enablelegacywindowsfsencoding()

改变默认文件系统编码和错误模式为"mbcs"和"replace",与python3.6之前的版本保持一致。仅限Windows平台使用。

等同于启动python前,定义PYTHONLEGACYWINDOWSFSENCODING环境变量。

sys.stdin; sys.stdout; sys.stderr

解释器用于标准输入、输出和错误的文件对象:

stdin:用于所有交互式输入(包括调用input())

stdout:用于输出print()和表达式语句,以及input()的提示

stderr:用于输出解释器本身的提示和错误信息

这些流是常规的文本文件(text file)对象,它们的参数选择如下:

字符编码取决于平台。在Windows平台,如果是在交互模式下,使用控制台代码页的编码,除此之外使用ANSI编码。在其他平台,使用语言环境编码(locale.getpreferredencoding())。不过所有平台都可以通过在启动python前,设置PYTHONIOENCODING环境变量重写编码。

在交互模式下,stdout和stderr流是行缓冲的,除此之外都是像文本文件那样块缓冲的。可以通过命令行参数"-u"重写

Note:要从标准流中读取二进制数据或写入二进制数据到标准流,使用底层的二进制buffer对象。例如写入字节到stdout,使用sys.stdout.buffer.write(b"abc")。然而如果你是在写一个python库,且不控制其代码在哪个上下文中执行,要注意标准流可能被不支持buffer属性的file-like对象如io.StringIO替换。

sys.__stdin__; sys.__stdout__; sys.__stderr__

sys.thread_info

包含线程实现信息的结构序列。

name:线程实现名称

"nt":Windows线程

"pthread":POSIX线程

"solaris":Solaris线程

lock:锁实现名称

"semaphore":使用信号的锁

"mutex_cond":使用互斥和条件变量的锁

None:锁信息未知

version:线程库的名称和版本。如果为None表示信息未知

sys.tracebacklimit

发生未处理的异常时,打印的回溯信息的最大层级。默认为1000。当设置为0或负数时,所有的回溯信息受到打印抑制,而只打印type和value

>>> raise Exception("throw")

Traceback (most recent call last):

File "", line 1, in

Exception: throw

>>> sys.tracebacklimit = 0

>>> raise Exception("throw")

Exception: throw

sys.version

包含python解释器版本号、使用的编译器及其构建号信息的字符串。在交互模式下启动python时会显示。不要直接在sys.version上提取版本信息,应该使用sys.version_info和platform模块提供的功能

sys.api_verison

解释器使用的C的接口版本。在调试python和扩展模块的版本冲突时可能有用。

sys.version_info

包含python版本信息的元组,命名元素分别为major, minor, micro, releaselevel和serial。除releaselevel外的所有值都是整数,releaselevel的值是"alpha", "beta", "candidate"或"final"中的一个。可以通过属性或下标访问。

>>> sys.version_info

sys.version_info(major=3, minor=6, micro=5, releaselevel='final', serial=0)

sys.warnoptions

warnings框架的实现细节,不要修改。

sys.winver

sys._xoptions

通过"-X"命令行选项传递的特定实现标志的字典对象(特定于CPython的访问方式)。

$ ./python -Xa=b -Xc

Python 3.2a3+ (py3k, Oct 16 2010, 20:14:50)

[GCC 4.4.3] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import sys

>>> sys._xoptions

{'a': 'b', 'c': True}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值