文章目录
命令行传参几个便捷的常量监听查找器和加载器一些信息元组不建议改动的信息常量一些无参函数其他函数命令行传参
argv
和orig_argv
可以起到传递命令行参数的作用。例如新建python文件testArgv.py
:
import sysprint(sys.argv)print(sys.orig_argv)
保存之后,在命令行输入
>python testArgv.py ab cde fg['testArgv.py', 'ab', 'cde', 'fg']['python', 'testArgv.py', 'ab', 'cde', 'fg']>python testArgv.py 1 2 3 4['testArgv.py', '1', '2', '3', '4']['python', 'testArgv.py', '1', '2', '3', '4']
即二者会将输入参数转为字符串。
几个便捷的常量
>>> sys.ps1'>>> '#没错就是交互模式下那个>>>>>>sys.ps1 = ':':sys.ps1 = '>>>'>>> sys.ps2'... '#当代码换行时表示连接>>> sys.float_repr_style'short' #此时repr函数将浮点数转为短字符串;否则其值为legacy
监听
对于部分系统函数,Python提供了监听功能,即调用这些函数时,会根据我们自定义的规则,弹出一些信息,这个功能是通过sys.addaudithook
的方法实现的。这种方法被翻译为添加审计钩子。
审计事件表中包含os.chdir
这个函数,所以接下来就以os.chdir
为例,解释一下python是如何监听的。
import osimport sysdef audit_hook(evt, args):... if evt in ['os.chdir']:...print(f'{evt=} {args=}\n current path={os.getcwd()}')...sys.addaudithook(audit_hook)os.chdir("E:")#注释部分为其返回值#evt='os.chdir' args=('E:',)# current path=C:\Users\laser
这似乎意味着,addaudithook(audit_hook)
的逻辑是,在调用审计事件os.chdir
之前,先执行一个函数audit_hook
,而在执行audit_hook
时,尚未更改文件夹,所以其输出为C:\Users\laser
这个路径。
查找器和加载器
在sys模块中,有一个成员变量sys.modules
,类型为字典,键值分别为python中各模块的名字和模块本身。
>>> for key in sys.modules:... print(key,sys.modules[key])...sys <module 'sys' (built-in)>builtins <module 'builtins' (built-in)>#。。。由于太多,中间这些就省略了importlib.machinery <module 'importlib.machinery' from 'C:\\Python310\\lib\\importlib\\machinery.py'>mpl_toolkits <module 'mpl_toolkits' (<_frozen_importlib_external._NamespaceLoader object at 0x0000022C39D3D5D0>)>
如果模块在sys.modules
中找不到,那就需要导入
模块,而在Python中,模块导入分为三步:搜索->加载->名字绑定,由此而产生查找器和加载器的概念。
与此相关的常量如下
>>> sys.meta_path #源路径查找器组成的列表[<class '_frozen_importlib.BuiltinImporter'>, <class '_frozen_importlib.FrozenImporter'>, <class '_frozen_importlib_external.PathFinder'>]>> sys.path_hooks #路径hook的列表,这些hook可以将路径转为查找器[<class 'zipimport.zipimporter'>, <function FileFinder.path_hook.<locals>.path_hook_for_FileFinder at 0x0000022C39C30B80>]>>> sys.path_importer_cache #字典类型,是查找器对象的缓存。key和value分别是路径和查找器{'C:\\Python310\\python310.zip': None, 'C:\\Python310\\DLLs': FileFinder('C:\\Python310\\DLLs'), 'C:\\Python310\\lib': FileFinder('C:\\Python310\\lib'), 'C:\\Python310\\lib\\encodings': FileFinder('C:\\Python310\\lib\\encodings'),}
其中,meta_path
相当于后备modules,对于modules
中没有的模块,就会调用meta_path
中的查找器进行查找。
一些信息元组
>>> sys.float_info #浮点数的相关信息sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.225073858507e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)>>> sys.int_info #整数信息sys.int_info(bits_per_digit=30, sizeof_digit=4)>>> sys.hash_info #哈希值信息sys.hash_info(width=64, modulus=2305843009213693951, inf=314159, nan=0, imag=1000003, algorithm='siphash24', hash_bits=64, seed_bits=128, cutoff=0)>>> sys.version_info #版本号信息sys.version_info(major=3, minor=10, micro=0, releaselevel='final', serial=0)>>> sys.thread_info#线程实现的信息sys.thread_info(name='nt', lock=None, version=None)>>> sys.implementation #有关解释器的实现信息namespace(name='cpython', cache_tag='cpython-310', version=sys.version_info(major=3, minor=10, micro=0, releaselevel='final', serial=0), hexversion=50987248)>>>sys.flagssys.flags(debug=0, inspect=0, interactive=0, optimize=0, dont_write_bytecode=0, no_user_site=0, no_site=0, ignore_environment=0, verbose=0, bytes_warning=0, quiet=0, hash_randomization=1, isolated=0, dev_mode=False, utf8_mode=0, warn_default_encoding=0)
不建议改动的信息常量
>>> import sys>>> sys.executable #python.exe的绝对路径'C:\\Python310\\python.exe'>>> sys.prefix'C:\\Python310'#当前python的安装路径>>> sys.exec_prefix'C:\\Python310'#基础python环境的安装路径>>> sys.base_exec_prefix'C:\\Python310'#基础python环境的安装路径>>> sys.byteorder'little' #大端序操作系统为big,小端序为little>>> sys.builtin_module_names #python解释器中的所有模块('_abc``_ast``_bisect',...)>>>sys.stdlib_module_names #包含标准库模组名称字符串的冻结集合frozenset({'tty``types``aifc',...})>>> sys.copyright #版权信息'Copyright (c) 2001- Python Software ...'>>> sys.version#版本信息'3.10.0 (tags/v3.10.0:b494f59, Oct 4 , 19:00:18) [MSC v.1929 64 bit (AMD64)]'>>> sys.hexversion #整数版本号50987248>>> sys.api_version #解释器的C API 版本。1013>>> sys.winver#windows注册表中的python版本号'3.10'>>> sys.dont_write_bytecodeFalse #若为true,则Python导入源码模块时不会写入.pyc文件>>> sys.platform'win32'>>> sys.dllhandle #仅在Windows下可用,指向 Python DLL 句柄140733403168768>>> sys.maxsize#64位平台一般为2^64-19223372036854775807>>> sys.maxunicode #最大Unicode码点值1114111>>> sys.platlibdir #库目录'lib'>>> print(sys.pycache_prefix) None #设为目录时用于缓存字节码>>> sys.warnoptions[]#警告框架的一个实现细节;勿改
一些无参函数
>>>sys.set_coroutine_origin_tracking_depth() #用于启用或禁用协程溯源>>>sys.get_coroutine_origin_tracking_depth()0 #>>> sys.is_finalizing()False #如果Python解释器正在退出则为True>>>sys.getdefaultencoding()'utf-8' #的默认字符串编码方式>>>sys.getfilesystemencodeerrors()'surrogatepass' #文件系统错误处理句柄>>>sys.getfilesystemencoding()'utf-8' #文件系统编码方式>>>sys.getallocatedblocks()20806 #解释器当前已分配的内存块数>>>sys.getwindowsversion() #Windows版本信息sys.getwindowsversion(major=10, minor=0, build=19043, platform=2, service_pack='')>>>sys.get_asyncgen_hooks() #返回一个 asyncgen_hooks 对象asyncgen_hooks(firstiter=None, finalizer=None)>>> sys.exc_info()#返回异常信息(None, None, None)
其中,exc_info
返回的三元组为(type, value, traceback)
,表示异常类型、异常实例以及回溯对象。
其他函数
#打印变量,交互式命令行中,计算结果若未赋给变量,则会运行displayhook>>> sys.displayhook('test') 'test'>>> sys.getsizeof(25) #返回对象大小28>>> sys.getsizeof([5]*20)216
set-get
get为无参函数,set为单参函数,
>>>sys.getrecursionlimit() 1000 #递归最大深度>>>sys.setrecursionlimit(1000) #设置递归最大深度>>>sys.getswitchinterval()0.005