【python】sys模組操作使用
sys是python中較為常用的一個模組,他提供了對python指令碼執行時的環境的操作。sys讓我們能夠訪問與python直譯器聯絡緊密的函式和變數。
1、sys.argv #將python指令碼執行時的指令碼名以及引數作為一個list,並輸出。
# -*- coding: utf-8 -*-
"""
Created on Fri Jan 5 23:24:34 2018
自定義檔案庫命名,然後轉出
@author: BruceWong
"""
import os
import sys
print(sys.argv)
print('the script name is:',sys.argv[0 ])
if len(sys.argv) > 1:
print("there are", len(sys.argv)-1, "arguments:") # 使用len(sys.argv)-1採集引數個數-1為減去[0]指令碼名稱
for arg in sys.argv[1:]: #輸出除了[0]外所有引數
print(arg)
else:
print("there are no arguments!")
'''
the script name is: C:/Users/BruceWong/.spyder-py3/selfdone/自定義檔案庫命名.py
there are no arguments!
'''
如果直接在ipython或者spyder的編譯器下執行,會反應編譯器的指令碼環境:
In [1]: import sys
In [2]: sys.argv
Out[2]: ['C:/Anaconda3/Scripts/ipython-script.py']
接下來還是在一個指令碼下執行,來進一步測試sys的功能;
2 、sys.path #返回一個list,該list為當前指令碼的path環境變數(PYTHONPATH)
print(sys.path)
'''
['', 'C:\\Anaconda3\\lib\\site-packages\\spyder\\utils\\site', 'C:\\ Anaconda3\\python35.zip', 'C:\\Anaconda3\\DLLs', 'C:\\Anaconda3\\lib', 'C:\\Anaconda3', 'C:\\Anaconda3\\lib\\site-packages', 'C:\\Anaconda3\\lib\\site-packages\\Mako-1.0.7-py3.5.egg', 'C:\\Anaconda3\\lib\\site-packages\\Sphinx-1.4.6-py3.5.egg', 'C:\\Wind\\Wind.NET.Client\\WindNET\\x64', 'C:\\Anaconda3\\lib\\site-packages\\xgboost-0.7-py3.5.egg', 'C:\\Anaconda3\\lib\\site-packages\\win32', 'C:\\Anaconda3\\lib\\site-packages\\win32\\lib', 'C:\\Anaconda3\\lib\\site-packages\\Pythonwin', 'C:\\Anaconda3\\lib\\site-packages\\setuptools-27.2.0-py3.5.egg', 'C:\\Anaconda3\\lib\\site-packages\\IPython\\extensions', 'C:\\Users\\BruceWong\\.ipython']
'''
如果我們要增加或者刪除pythonpath的話,使用list的insert或者pop功能即可。
3、sys.platform #返回當前平臺
In [3]: print(sys.platform)
win32
4、sys.stdout sys.stdin # stdin , stdout , 以及stderr 變數包含與標準I/O 流對應的流物件. 如果需要更好地控制輸出,而print 不能滿足你的要求, 它們就是你所需要的. 你也可以替換它們, 這時候你就可以重定向輸出和輸入到其它裝置( device ), 或者以非標準的方式處理它們
saveout = sys.stdout # 終在重定向前儲存stdout,這樣的話之後你還可以將其設回正常
fsock = open('out.log', 'w') # 開啟一個新檔案用於寫入。如果檔案不存在,將會被建立。如果檔案存在,將被覆蓋。
sys.stdout = fsock # 所有後續的輸出都會被重定向到剛才開啟的新檔案上。
print('This message will be logged instead of displayed') # 這樣只會將輸出結果“列印”到日誌檔案中;螢幕上不會看到輸出
sys.stdout = saveout # 在我們將 stdout 搞亂之前,讓我們把它設回原來的方式。
fsock.close() # 關閉日誌檔案。
5、sys.modules #sys.modules是一個全域性字典,該字典是python啟動後就載入在記憶體中。每當程式設計師匯入新的模組,sys.modules將自動記錄該模組。當第二次再匯入該模組時,python會直接到字典中查詢,從而加快了程式執行的速度。它擁有字典所擁有的一切方法。
print(sys.modules.keys())
print(sys.modules.values())
print(sys.modules["os"])
#<module 'os' from 'C:\\Anaconda3\\lib\\os.py'>
6、sys.exit(n) 執行到主程式末尾,直譯器自動退出,但是如果需要中途退出程式,可以呼叫sys.exit函式,帶有一個可選的整數引數返回給呼叫它的程式,表示你可以在主程式中捕獲對sys.exit的呼叫。(0是正常退出,其他為異常)
In [5]: import sys
...:
...: def exitfunc(value):
...: print(value)
...: sys.exit(0)
...:
...: print("hello")
...:
...: try:
...: sys.exit(1)
...: except SystemExit or value:
...: exitfunc(value)
...:
...:
...: print("come?")
...:
...:
...:
hello
---------------------------------------------------------------------------
SystemExit Traceback (most recent call last)
<ipython-input-5-d8e0c0f13067> in <module>()
9 try:
---> 10 sys.exit(1)
11 except SystemExit or value:
SystemExit: 1
#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/8'
# sys_demo.py sys直譯器相關函式
# 該模組含有直譯器的一些變數,與直譯器互動的函式
import sys
def sys_demo():
# 預設編碼
print(sys.getdefaultencoding())
# Python版本
print(sys.version)
# 新增模組路徑到搜尋路徑
sys.path.append("./module")
# (函式)列印異常資訊
try:
1 / 0
except:
types, value, back = sys.exc_info() # 捕獲異常
sys.excepthook(types, value, back) # 列印異常
# 輸入和輸出
sys.stdout.write(">> ")
sys.stdout.flush()
strs = sys.stdin.readline()[:-1]
sys.stderr.write("輸入的內容為: {}".format(strs))
sys.stderr.flush()
def sys_func():
lists = sys.argv # 傳遞給Python指令碼的命令列引數列表 => python p.py -> ['p.py'] / python p.py a 1 -> ['p.py', 'a', '1'] / 程式內執行 -> ['']
strs = sys.getdefaultencoding() # 預設字符集名稱
strs = sys.getfilesystemencoding() # 系統檔名字符集名稱
num = sys.getrefcount(object) # 返回object的引用計數(比實際多1個)
dicts = sys.modules # 已載入的模組, 可修改, 但不能通過修改返回的字典進行修改
lists = sys.path # 模組搜尋路徑
sys.path.append("./test") # 動態新增模組搜尋路徑
strs = sys.platform # 平臺識別符號(系統身份進行詳細的檢查,推薦使用) Linux:'linux' / Windows:'win32' / Cygwin:'cygwin' / Mac OS X:'darwin'
strs = sys.version # python直譯器版本
lists = sys.thread_info # 執行緒資訊
num = sys.api_version # 直譯器C API版本
types, value, back = sys.exc_info() # 捕獲異常 詳見 異常 文章的 excep() 程式碼塊第二小部分(http://blog.csdn.net/rozol/article/details/69313164)
sys.excepthook(types, value, back) # 列印異常
types = sys.last_type
value = sys.last_value
back = sys.last_traceback
# sys.exit([arg]) // 引發SystemExit異常退出Python(可以try), 範圍[0,127], None==0, "string"==1
sys.exit(0)
num = sys.getrecursionlimit() # 最大遞迴數(堆疊最大深度), 詳見 函式 文章(http://blog.csdn.net/rozol/article/details/69242050)
sys.setrecursionlimit(5000) # 修改最大遞迴數
fnum = sys.getswitchinterval() # 獲取執行緒切換間隔
sys.setswitchinterval(0.005) # 設定執行緒切換間隔, 單位秒
num = sys.getcheckinterval() # 直譯器的檢查間隔
sys.setcheckinterval(100) # 設定直譯器檢查間隔, 執行(預設)100個虛擬指令執行一次檢查, 值為<=0時,檢查每個虛擬指令
# sys.stdin // 標準輸入流
strs = sys.stdin.readline()[:-1]
# sys.stdout // 標準出入輸出
sys.stdout.write(">>")
sys.stdout.flush()
# sys.stderr // 標註錯誤流
sys.stderr.write(">>")
# ---
lists = sys.builtin_module_names # 所有模組 (注:非匯入模組)
path = sys.base_exec_prefix # Python安裝路徑
path = sys.base_prefix # 同base_exec_prefix
path = sys.exec_prefix # 同base_exec_prefix
path = sys.prefix # 同base_exec_prefix
path = sys.executable # Python直譯器的絕對路徑
strs = ys.byteorder # 本機位元組順序指示器, big-endian(最高有效位元組在第一位)值為'big', little-endian(最低有效位元組在第一位)值為'little'
strs = sys.copyright # python版權
num = sys.hexversion # 16進製版本號
lists = sys.implementation # 當前執行的直譯器的資訊
num = sys.getallocatedblocks() # 直譯器當前分配的記憶體塊的數量
boolean = sys.dont_write_bytecode # 是否不會嘗試匯入源模組是寫入.pyc檔案 (False會寫入.pyc檔案)
# sys.getsizeof(object[, default]) // 返回物件的大小bit, 只計算自身記憶體消耗,不計算引用物件的記憶體消耗, 呼叫物件的__sizeof__(), default沒有獲取到預設返回值
num = sys.getsizeof(object)
boolean = sys.is_finalizing() # 直譯器是否正在被關機
num = sys.maxsize # 最大整數值(2 ** 31 -1), 與系統有關
num = sys.maxunicode # 最大Unicode值的整數 (1114111)
strs = sys.ps1 # 直譯器主提示符
strs = sys.ps2 # 直譯器次提示符
sys.call_tracing(func, ("arg",)) # 呼叫函式
sys._clear_type_cache() # 清除內部型別快取
sys._debugmallocstats() # 列印CPython記憶體分配器狀態的低階資訊
sys.setprofile(profilefunc) # 設定profile函式, 預設None
sys.getprofile() # 獲取profile函式
sys.settrace(tracefunc) # 設定跟蹤函式, def tracefunc(frame、event 和arg):
sys.gettrace() # 獲取跟蹤函式, 預設None
sys.set_coroutine_wrapper(wrapper) # 設定包裝 def wrapper(coro):
sys.get_coroutine_wrapper() # 包裝, 預設None
if __name__ == "__main__":
sys_demo()
# sys_func()