Python實用教程_spiritx的博客-CSDN博客
sys 模塊主要負責與 Python 解釋器進行交互,該模塊提供了一系列用于控制 Python 運行環(huán)境的函數(shù)和變量。
函數(shù)和對象清單
對象名稱 |
對象說明 |
sys.argv |
命令行參數(shù)List,第一個元素是程序本身路徑? |
sys.path |
返回模塊的搜索路徑,初始化時使用PYTHONPATH環(huán)境變量的值? |
sys.modules |
返回系統(tǒng)導(dǎo)入的模塊字段,key是模塊名,value是模塊? |
sys.exc_info() |
獲取當前正在處理的異常類,exc_type、exc_value、exc_traceback當前處理的異常詳細信息 |
sys.exit(n) |
退出程序,正常退出時exit(0) |
sys.hexversion |
獲取Python解釋程序的版本值,16進制格式如:0x020403F0 |
sys.version |
獲取Python解釋程序的版本信息 |
sys.platform |
返回操作系統(tǒng)平臺名稱 |
sys.stdout |
標準輸出 |
sys.stdout.write() |
標準輸出內(nèi)容 |
sys.stdout.writelines() |
無換行輸出 |
sys.stdin |
標準輸入 |
sys.stdin.read() |
輸入一行 |
sys.stderr |
錯誤輸出 |
sys.exc_clear() |
用來清除當前線程所出現(xiàn)的當前的或最近的錯誤信息? |
sys.exec_prefix |
返回平臺獨立的python文件安裝的位置? |
sys.byteorder |
本地字節(jié)規(guī)則的指示器 |
sys.copyright |
記錄python版權(quán)相關(guān)的東西? |
sys.api_version |
解釋器的C的API版本? |
sys.version_info |
返回你當前所使用的Python版本號 |
sys.getdefaultencoding() |
返回當前你所用的默認的字符編碼格式? |
sys.getfilesystemencoding() |
返回將Unicode文件名轉(zhuǎn)換成系統(tǒng)文件名的編碼的名字? |
sys.builtin_module_names |
Python解釋器導(dǎo)入的內(nèi)建模塊列表? |
sys.executable |
Python解釋程序路徑? |
sys.getwindowsversion() |
獲取Windows的版本? |
sys.stdin.readline() |
從標準輸入讀一行 |
sys.setdefaultencoding() |
用來設(shè)置當前默認的字符編碼(詳細使用參考文檔)? |
sys.displayhook(value) |
如果value非空,這個函數(shù)會把他輸出到sys.stdout(詳細使用參考文檔) |
主要對象和函數(shù)的說明
sys.flags
返回一個具名元組,python命令行的參數(shù)狀態(tài),這些屬性是只讀的:
flags.debug |
-d |
flags.inspect |
-i |
flags.interactive |
-i |
flags.isolated |
-I |
flags.optimize |
-O?或?-OO |
flags.dont_write_bytecode |
-B |
flags.no_user_site |
-s |
flags.no_site |
-S |
flags.ignore_environment |
-E |
flags.verbose |
-v |
flags.bytes_warning |
-b |
flags.quiet |
-q |
flags.hash_randomization |
-R |
flags.dev_mode |
-X?dev?(Python?開發(fā)模式) |
flags.utf8_mode |
-X?utf8 |
flags.safe_path |
-P |
flags.int_max_str_digits |
-X?int_max_str_digits?(integer string conversion length limitation) |
flags.warn_default_encoding |
-X?warn_default_encoding |
sys.argv
獲取運行 Python 程序的命令行參數(shù)。其中 :
sys.argv[0] 通常就是指該 Python 程序
sys.argv[1] 代表為 Python 程序提供的第一個參數(shù)
sys.argv[2] 代表為 Python 程序提供的第二個參數(shù)
……依此類推。
#sys.py
#!/usr/bin/env python
import sys
print sys.argv[0]
print sys.argv[1]
# python sys.py argv1
sys.py
argv1
如果是通過 Python 解釋器的命令行參數(shù) -c 來執(zhí)行的, argv[0] 會被設(shè)置成字符串 '-c' 。如果沒有腳本名被傳遞給 Python 解釋器, argv[0] 為空字符串。
sys.path
是搜索路徑列表,每個元素都是一個目錄名,在使用 import 語句導(dǎo)入模塊時,解釋器就會從這些路徑列表中查找指定的模塊。
>>>import sys
>>>sys.path
['/Applications/PyCharm CE.app/Contents/plugins/python-ce/helpers/pydev', '/Applications/PyCharm CE.app/Contents/plugins/python-ce/helpers/third_party/thriftpy', '/Applications/PyCharm CE.app/Contents/plugins/python-ce/helpers/pydev']
?sys.exit(n)
執(zhí)行到主程序末尾,解釋器自動退出,但是如果需要中途退出程序,可以調(diào)用sys.exit函數(shù),帶有一個可選的整數(shù)參數(shù)返回給調(diào)用它的程序,表示你可以在主程序中捕獲對sys.exit的調(diào)用。(0是正常退出,其他為異常)
import sys
def exitfunc(value):
print value
sys.exit(0)
print "hello"
try:
sys.exit(1)
except SystemExit,value:
exitfunc(value)
print "come?”
# python exit.py
hello
1
exit()之后的代碼不會被執(zhí)行。
sys.modules
返回模塊名和載入模塊對應(yīng)關(guān)系的字典
sys.modules
{'sys': <module 'sys' (built-in)>, 'builtins': <module 'builtins' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, '_imp': <module '_imp' (built-in)>, '_thread': <module '_thread' (built-in)>, '_warnings': <module '_warnings' (built-in)>, '_weakref': <module '_weakref' (built-in)>, '_io': <module '_io' (built-in)>, 'marshal': <module 'marshal' (built-in)>, 'posix': <module 'posix' (built-in)>, '_frozen_importlib_external': <module '_frozen_importlib_external' (frozen)>, 'time': <module 'time' (built-in)>, 'zipimport': <module 'zipimport' (frozen)>, '_codecs': <module '_codecs' (built-in)>, 'codecs': <module 'codecs' (frozen)>, ...>}
sys.platform
獲取當前執(zhí)行環(huán)境的平臺
>>>sys.platform
'darwin'
系統(tǒng) |
|
---|---|
AIX |
|
Emscripten |
|
Linux |
|
WASI |
|
Windows |
|
Windows/Cygwin |
|
macOS |
|
FreeBSD | 'freebsd' |
對于 Unix 系統(tǒng)(除 Linux 和 AIX 外),該字符串是?Python 構(gòu)建時的?uname?-s
?返回的小寫操作系統(tǒng)名稱,并附加了?uname?-r
?返回的系統(tǒng)版本的第一部分,如?'sunos5'
?或?'freebsd8'.
在 3.8 版更改: 在 AIX 上,sys.platform 將不再包含主要版本號。 它將總是 'aix',而不是 'aix5' 或 'aix7'。
sys.stdin、sys.stdout、sys.stderr
標準輸入、標準輸出和標準錯誤的 文件對象:
- stdin 用于所有交互式輸入(包括對 input() 的調(diào)用);
- stdout 用于 print() 和 expression 語句的輸出,以及用于 input() 的提示符;
- 解釋器自身的提示符和它的錯誤消息都發(fā)往 stderr。
- 這些流都是常規(guī) 文本文件,與 open() 函數(shù)返回的對象一致。
sys.version、sys.api_version、sys.version_info
解釋器的版本信息
>>>sys.version
'3.11.4 (main, Jul 5 2023, 09:00:44) [Clang 14.0.6 ]’
>>>sys.api_version
1013
>>>sys.version_info
sys.version_info(major=3, minor=11, micro=4, releaselevel='final', serial=0)
版本號五部分的元組:?major,?minor,?micro,?releaselevel?和?serial。 除?releaselevel?外的所有值均為整數(shù);發(fā)布級別值則為?'alpha'
,?'beta'
,?'candidate'
?或?'final'
。
sys.settrace(tracefunc)
設(shè)置系統(tǒng)的跟蹤函數(shù),使得用戶在 Python 中就可以實現(xiàn) Python 源代碼調(diào)試器。該函數(shù)是特定于單個線程的.
跟蹤函數(shù)應(yīng)接收三個參數(shù):frame、event?和?arg。frame?是當前的堆棧幀。event?是一個字符串:'call'
、'line'
、'return'
、'exception'
?或?'opcode'
。arg?取決于事件類型。
每次進入 trace 函數(shù)的新的局部作用范圍,都會調(diào)用 trace 函數(shù)(?event?會被設(shè)置為?'call'
?),它應(yīng)該返回一個引用,指向即將用在新作用范圍上的局部跟蹤函數(shù);如果不需要跟蹤當前的作用范圍,則返回?None
。
局部跟蹤函數(shù)應(yīng)返回對自身的引用(或?qū)α硪粋€函數(shù)的引用,用來在其作用范圍內(nèi)進行進一步的跟蹤),或者返回?None
?來停止跟蹤其作用范圍。
如果跟蹤函數(shù)出錯,則該跟蹤函數(shù)將被取消設(shè)置,類似于調(diào)用?settrace(None)
。
這些事件具有以下含義:
'call'
表示調(diào)用了某個函數(shù)(或進入了其他的代碼塊)。全局跟蹤函數(shù)將被調(diào)用,arg?為?None
。返回值將指定局部跟蹤函數(shù)。
- 'line'
執(zhí)行下一行代碼
'return'
表示某個函數(shù)(或別的代碼塊)即將返回。局部跟蹤函數(shù)將被調(diào)用,arg?是即將返回的值,如果此次返回事件是由于拋出異常,arg?為?None
。跟蹤函數(shù)的返回值將被忽略。
'exception'
表示發(fā)生了某個異常。局部跟蹤函數(shù)將被調(diào)用,arg?是一個?(exception,?value,?traceback)
?元組,返回值將指定新的局部跟蹤函數(shù)。
- 'opcode'
執(zhí)行新的opcode
注意,由于異常是在鏈式調(diào)用中傳播的,所以每一級都會產(chǎn)生一個?'exception'
?事件。
更細微的用法是,可以顯式地通過賦值 frame.f_trace = tracefunc 來設(shè)置跟蹤函數(shù),而不是用現(xiàn)有跟蹤函數(shù)的返回值去間接設(shè)置它。當前幀上的跟蹤函數(shù)必須激活,而 settrace() 還沒有做這件事。注意,為了使上述設(shè)置起效,必須使用 settrace() 來安裝全局跟蹤函數(shù)才能啟用運行時跟蹤機制,但是它不必與上述是同一個跟蹤函數(shù)(它可以是一個開銷很低的跟蹤函數(shù),只返回 None,即在各個幀上立即將其自身禁用)。
# program to display the functioning of
# settrace()
from sys import settrace
# local trace function which returns itself
def my_tracer(frame, event, arg=None):
# extracts frame code
code = frame.f_code
# extracts calling function name
func_name = code.co_name
# extracts the line number
line_no = frame.f_lineno
print(f"trace:A {event} encountered in {func_name}() at line number {line_no} , {arg=}")
return my_tracer
# global trace function is invoked here and
# local trace function is set for fun()
def foo(a:str):
print('foo() run...')
return a+"OK."
# global trace function is invoked here and
# local trace function is set for check()
def call():
print('call() run ...')
return foo('test')
# returns reference to local
# trace function (my_tracer)
settrace(my_tracer)
call()
‘’'
trace:A call encountered in call() at line number 28 , arg=None
trace:A line encountered in call() at line number 29 , arg=None
call() run ...
trace:A line encountered in call() at line number 30 , arg=None
trace:A call encountered in foo() at line number 21 , arg=None
trace:A line encountered in foo() at line number 22 , arg=None
foo() run...
trace:A line encountered in foo() at line number 23 , arg=None
trace:A return encountered in foo() at line number 23 , arg='testOK.'
trace:A return encountered in call() at line number 30 , arg='testOK.'
‘''
從上面的例子中可以看到,當運行到return時,可以從arg獲取到return后面的返回內(nèi)容。
如果要獲得跟蹤的函數(shù)內(nèi)部信息,需要對frame進行分析:
-
f_code
?該函數(shù)對應(yīng)code object(類似字節(jié)碼) - f_code.co_name:運行代碼的函數(shù)名
- f_code.co_filename:源代碼文件名
- f_code.co_varnames:函數(shù)的局部變量名
- f_lineno:源代碼代碼行號
- f_locals:運行代碼的局部變量,是一個字典類型
- f_globals:運行代碼的全局變量,是一個字典類型,這個里面很大,有很多系統(tǒng)信息也存儲在里面
-
f_builtins
?該函數(shù)內(nèi)置函數(shù) -
f_back
?調(diào)用這個函數(shù)的函數(shù)的frame -
f_lasti
?last instruction類似匯編中program counter(函數(shù)執(zhí)行到哪了下一步干嘛)
可以根據(jù)event設(shè)置過濾,如下面統(tǒng)計函數(shù)的執(zhí)行時間:
import sys
import time
start_time = {}
def trace_function(frame, event, arg):
global start_time
if event == 'call':
start_time[frame] = time.time()
elif event == 'return':
end_time = time.time()
time_taken = end_time - start_time[frame]
print('Function {} took {:.2f} seconds to execute'.format(frame.f_code.co_name, time_taken))
return trace_function
def function_to_trace():
print('I am being traced!')
time.sleep(1)
sys.settrace(trace_function)
function_to_trace()
sys.settrace(None)
sys.exc_info()
本函數(shù)返回的元組包含三個值,它們給出當前正在處理的異常的信息。返回的信息僅限于當前線程和當前堆棧幀。如果當前堆棧幀沒有正在處理的異常,則信息將從下級被調(diào)用的堆棧幀或上級調(diào)用者等位置獲取,依此類推,直到找到正在處理異常的堆棧幀為止。此處的“處理異常”指的是“執(zhí)行 except 子句”。任何堆棧幀都只能訪問當前正在處理的異常的信息。文章來源:http://www.zghlxwxcb.cn/news/detail-699248.html
如果整個堆棧都沒有正在處理的異常,則返回包含三個?None
?值的元組。否則返回值為?(type,?value,?traceback)
。它們的含義是:type?是正在處理的異常類型(它是?BaseException?的子類);value?是異常實例(異常類型的實例);traceback?是一個?回溯對象,該對象封裝了最初發(fā)生異常時的調(diào)用堆棧。文章來源地址http://www.zghlxwxcb.cn/news/detail-699248.html
到了這里,關(guān)于Python標準庫sys的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!