1. 程式人生 > >【python】sys模組操作使用

【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()