python sys模塊詳解

sys介紹

“sys”即“system”,“系統”之意。該模塊提供了一些接口,用於訪問 Python 解釋器自身使用和維護的變量,同時模塊中還提供了一部分函數,可以與解釋器進行比較深度的交互。

常用方法

sys.argv

“argv”即“argument value”的簡寫,是一個列表對象,其中存儲的是在命令行調用 Python 腳本時提供的“命令行參數”。

這個列表中的第一個參數是被調用的腳本名稱,也就是說,調用 Python 解釋器的“命令”(python)本身並沒有被加入這個列表當中。

import sys

print("The list of command line arguments:\n", sys.argv)

輸出:

$ python sy1.py 
('The list of command line arguments:\n', ['sy1.py'])

$ python sy1.py arg1 arg2 arg3
('The list of command line arguments:\n', ['sy1.py', 'arg1', 'arg2', 'arg3'])

sys.platform

查看sys模塊中的sys.platform屬性可以得到關於運行平臺更詳細的信息。
win

>>> import sys
>>> sys.platform
'win32'

在 Linux 上:

>>> sys.platform
'linux'

比較一下os.name的結果,sys.platform的信息更加準確。

sys.byteorder

“byteorder”即“字節序”,指的是在計算機內部存儲數據時,數據的低位字節存儲在存儲空間中的高位還是低位。

“小端存儲”時,數據的低位也存儲在存儲空間的低位地址中,此時sys.byteorder的值爲“little”。如果不注意,在按地址順序打印內容的時候,可能會把小端存儲的內容打錯。當前大部分機器都是使用的小端存儲。

>>> sys.byteorder
'little'

而另外還存在一種存儲順序是“大端存儲”,即數據的高位字節存儲在存儲空間的低位地址上,此時sys.byteorder的值爲“big”。

>>> sys.byteorder
'big'

sys.executable

該屬性是一個字符串,在正常情況下,其值是當前運行的 Python 解釋器對應的可執行程序所在的絕對路徑。

>>> sys.executable
'/usr/bin/python'

sys.modules

該屬性是一個字典,包含的是各種已加載的模塊的模塊名到模塊具體位置的映射。

通過手動修改這個字典,可以重新加載某些模塊;但要注意,切記不要大意刪除了一些基本的項,否則可能會導致 Python 整個兒無法運行。

>>> sys.modules
{'copy_reg': <module 'copy_reg' from '/usr/lib64/python2.7/copy_reg.pyc'>, 'sre_compile': <module 'sre_compile' from '/usr/lib64/python2.7/sre_compile.pyc'>

sys.builtin_module_names

該屬性是一個字符串元組,其中的元素均爲當前所使用的的 Python 解釋器內置的模塊名稱。

注意區別sys.modulessys.builtin_module_names——前者的關鍵字(keys)列出的是導入的模塊名,而後者則是解釋器內置的模塊名。

sys.builtin_module_names
('__builtin__', '__main__', '_ast', '_codecs', '_sre', '_symtable', '_warnings', '_weakref', 'errno', 'exceptions', 'gc', 'imp', 'marshal', 'posix', 'pwd', 'signal', 'sys', 'thread', 'zipimport')

sys.path

該屬性是一個由字符串組成的列表,其中各個元素表示的是 Python 搜索模塊的路徑;在程序啓動期間被初始化。

其中第一個元素(也就是path[0])的值是最初調用 Python 解釋器的腳本所在的絕對路徑;如果是在交互式環境下查看sys.path的值,就會得到一個空字符串。

#!/usr/bin/python
import sys
print sys.path
print sys.path[0]
print sys.path[1]

輸出:

$ python sy2.py 
['/root/python/sys', '/usr/lib/python2.7/site-packages/s3cmd-2.0.2-py2.7.egg', '/usr/lib/python2.7/site-packages/python_magic-0.4.15-py2.7.egg', '/usr/lib/python2.7/site-packages/UNKNOWN-0.0.0-py2.7.egg', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/lib64/python2.7/site-packages/gtk-2.0', '/usr/lib/python2.7/site-packages']
/root/python/sys
/usr/lib/python2.7/site-packages/s3cmd-2.0.2-py2.7.egg

sys.stdin

即 Python 的標準輸入通道。通過改變這個屬性爲其他的類文件(file-like)對象,可以實現輸入的重定向,也就是說可以用其他內容替換標準輸入的內容。

所謂“標準輸入”,實際上就是通過鍵盤輸入的字符。
sys.stdin.readline() 相當於input,區別在於input不會讀入’\n’
實例1

import sys
print('Plase input your name: ')
name = sys.stdin.readline()
print('Hello ', name)

輸出:

Plase input your name: 
hello world   
('Hello ', 'hello world\n')

實例2

while True:
    n = int(input('Please input a number:\n'))
    sn = list(map(int,input('Please input some numbers:\n').split()))
    print(n)
    print(sn,'\n')

輸出:

Please input a number:
34 
Please input some numbers:
34 353
34
[34, 353] 

sys.stdout

與上一個“標準輸入”類似,sys.stdout則是代表“標準輸出”的屬性。

通過將這個屬性的值修改爲某個文件對象,可以將本來要打印到屏幕上的內容寫入文件。
實例1

import sys
# 以附加模式打開文件,若不存在則新建
with open("count_log.txt", 'a', encoding='utf-8') as f:
    sys.stdout = f
    for i in range(10):
        print("count = ", i)

輸出:

$ cat count_log.txt 
count =  0
count =  1
count =  2
count =  3
count =  4
count =  5
count =  6
count =  7
count =  8
count =  9

實例2:

import sys

sys.stdout.write('hello'+'\n')
print 'hello'
$ python sy7.py
hello
hello

sys.err

與前面兩個屬性類似,只不過該屬性標識的是標準錯誤,通常也是定向到屏幕的,可以粗糙地認爲是一個輸出錯誤信息的特殊的標準輸出流。由於性質類似,因此不做演示。

此外,sys模塊中還存在幾個“私有”屬性:sys.stdin,sys.stdout,sys.stderr。這幾個屬性中保存的就是最初定向的“標準輸入”、“標準輸出”和“標準錯誤”流。在適當的時侯,我們可以藉助這三個屬性將sys.stdin、sys.stdout和sys.err恢復爲初始值。

sys.exit(n)

功能:執行到主程序末尾,解釋器自動退出,但是如果需要中途退出程序,可以調用sys.exit函數,帶有一個可選的整數參數返回給調用它的程序,表示你可以在主程序中捕獲對sys.exit的調用。(0是正常退出,其他爲異常)

#!/usr/bin/env python

import sys

def exitfunc(value):
    print value
    sys.exit(0)

print "hello"

try:
    sys.exit(1)
except SystemExit,value:
    exitfunc(value)

print "come?"

輸出:

$ python sy11.py 
hello
1

參考資料:
純潔的微笑
https://www.cnblogs.com/turtle-fly/p/3280519.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章