Python 學習筆記 (8)—— sys模塊

主要介紹用的比較多的sys的模塊命令包括:sys.argv,sys.platform,sys.getdefaultencoding,sys.setdefaultencoding(),sys.getfilesystemencoding(),sys.exit(n),sys.path,sys.modules.keys(),sys.stdin,sys.stdout,sys.stderr 等。node

sys.argv    獲取參數
參數獲取從0開始,而不是1,0爲命令自己
#!/usr/bin/python
import sys
print "I the first arg :", sys.argv[1]
print "I the second arg :", sys.argv[2]
print "All of the args are :"
for i in sys.argv:
        print i
python

執行結果:
[root@node1 python]# python arg.py hello python
I the first arg : hello
I the second arg : python
All of the args are :
arg.py
hello
python
linux

sys.platform   獲取當前操做系統平臺windows

具體的返回值以下:
>>> import sys
>>> sys.platform
'linux2'
ide

操做系統 返回值
Linux (2.x and 3.x)
'linux2'
Windows
 'win32' 
Windows/Cygwin
 'cygwin'
Mac OS X
'darwin' 
OS/2
 'os2'
OS/2 EMX
'os2emx' 
RiscOS
'riscos'
AtheOS
'atheos'
函數

 

實例:
根據不一樣操做系統判斷該使用什麼命令,例如在在linux 下用「clear」而在windows下用「cls」
ui

#!/usr/bin/python
import sys
ostype = sys.platform
if ostype == "linux" or ostype == "linux2":
        cmd = "clear"
else:
        cmd = "cls"
print "The clear command is :", cmd

[root@node1 python]# python os.py 
The clear command is : clear
this

sys.exit(n)        設置退出返回值(0表示正常退出,其餘非0整數表示不正常,能夠經過異常捕獲)編碼

 

#!/usr/bin/python
import sys
def exitFunc(value):
        '''Clear function'''
        print value
        sys.exit()

print "hello"

try:
        sys.exit(1)
except SystemExit,value:
        exitFunc(value)
print "Ok"

[root@node1 python]# python esc.py 
hello
1
spa

sys.path      返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值
在經過命令"import module_name"時,系統將在如下路徑中查找導入的模塊,其中第一個爲空,表示當前目錄
>>> import sys
>>> sys.path
['', '/usr/lib64/python26.zip', '/usr/lib64/python2.6', '/usr/lib64/python2.6/plat-linux2', '/usr/lib64/python2.6/lib-tk', 
'/usr/lib64/python2.6/lib-old', '/usr/lib64/python2.6/lib-dynload', '/usr/lib64/python2.6/site-packages', 
'/usr/lib64/python2.6/site-packages/gtk-2.0', '/usr/lib/python2.6/site-packages']

 

sys.modules.keys()    使用sys模塊查找已導入的模塊
>>> import sys
>>> print sys.modules.keys()
['copy_reg', 'encodings', 'site', '__builtin__', '__main__', 'encodings.encodings', 'abc', 'posixpath', 
'errno', 'encodings.codecs', '_abcoll', 'types', '_codecs', '_warnings', 'genericpath', 'stat', 'zipimport',
 'encodings.__builtin__', 'warnings', 'UserDict', 'encodings.utf_8', 'sys', 'codecs', 'readline', 'os.path',
 'signal', 'linecache', 'posix', 'encodings.aliases', 'exceptions', 'os']

sys.getdefaultencoding()    獲取系統當前編碼,通常默認爲ascii。


>>> import sys
>>> sys.getdefaultencoding()
'ascii'

sys.setdefaultencoding()    設置系統默認編碼


執行dir(sys)時不會看到這個方法,在解釋器中執行不經過,能夠先執行reload(sys),再執行 setdefaultencoding('utf8'),此時將系統默認編碼設置爲utf8。
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('utf8')

 

sys.getfilesystemencoding()    獲取文件系統使用編碼方式
>>> sys.getfilesystemencoding()
'UTF-8'

 

sys.stdin,sys.stdout,sys.stderr
標準輸入和標準錯誤 (一般縮寫爲 stdout 和 stderr) 是內建在每個 UNIX 系統中的管道。 
當你 print 某些東西時,結果前往 stdout 管道;
當你的程序崩潰並打印出調試信息 (例如 Python 中的 traceback (錯誤跟蹤)) 的時候,信息前往 stderr 管道 
stdout 是一個類文件對象;調用它的 write 函數能夠打印出你給定的任何字符串。
實際上,這就是 print 函數真正作的事情;它在你打印的字符串後面加上一個硬回車,而後調用 sys.stdout.write 函數。

>>> for i in range(3):
...     print'Dive in'

Dive in
Dive in
Dive in
>>> import sys
>>> for i in range(3):
...     sys.stdout.write('Dive in')

Dive inDive inDive in
>>> for i in range(3):
...     sys.stderr.write('Dive in')

Dive inDive inDive in


在最簡單的例子中,stdout 和 stderr 把它們的輸出發送到相同的地方
和 stdout 同樣,stderr 並不爲你添加硬回車;若是須要,要本身加上。
stdout 和 stderr 都是類文件對象,可是它們都是隻寫的。
它們都沒有 read 方法,只有 write 方法。然而,它們仍然是類文件對象,所以你能夠將其它任何 (類) 文件對象賦值給它們來重定向其輸出。

 

使用sys重定向輸出
print 'Dive in'                 # 標準輸出
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()                   # 關閉日誌文件。

重定向錯誤信息
fsock = open('error.log', 'w')                   # 打開你要存儲調試信息的日誌文件。 
sys.stderr = fsock                               # 將新打開的日誌文件的文件對象賦值給stderr以重定向標準錯誤。
raise Exception, 'this error will be logged'     # 引起一個異常,沒有在屏幕上打印出任何東西,全部正常的跟蹤信息已經寫進error.log

 

還要注意你既沒有顯式關閉日誌文件,也沒有將 stderr 設回最初的值。
這樣挺好,由於一旦程序崩潰 (因爲引起的異常),Python 將替咱們清理並關閉文件打印到 stderr
向標準錯誤寫入錯誤信息是很常見的,因此有一種較快的語法能夠馬上導出信息

>>> print 'entering function'
entering function
>>> import sys
>>> print >> sys.stderr, 'entering function'

entering function 
print 語句的快捷語法能夠用於寫入任何打開的文件 (或者是類文件對象)。 
在這裏,你能夠將單個print語句重定向到stderr並且不用影響後面的print語句。

 

簡明教程中的實例
import sys
def readfile(filename):
        '''Print a file to the standard output.'''
        f = file(filename)
        while True:
                line = f.readline()
                if len(line) == 0:
                        break
                print line,
        f.close()
if len(sys.argv) < 2:
        print 'No action specified.'
        sys.exit()
if sys.argv[1].startswith('--'):
        option = sys.argv[1][2:]
        if option == 'version':
                print "Version 1.2"
        elif option == 'help':
                print '''\
This program prints file to the standard output.
Any number of files can be specified.
Options include:
        --version : Prints the version number
        --help    : Display this help'''
        else:
                print 'Unknown option.'
else:
        for filename in sys.argv[1:]:
                readfile(filename)

 

執行結果:
[root@node1 python]# python cat.py 
No action specified.

[root@node1 python]# python cat.py --help
This program prints file to the standard output.
Any number of files can be specified.
Options include:
    --version : Prints the version number
    --help    : Display this help

 

[root@node1 python]# python cat.py --version
Version 1.2

 

[root@node1 python]# python cat.py --t
Unknown option.

 

[root@node1 python]# python cat.py /tmp/test.txt 
hello girl!
hello boy!
hello man!

 

工做原理:
定義readfile 函數逐行讀取文件,執行腳本後,判斷參數。若參數長度小於2(命令自己佔一個長度,也就是說,命令+參數),輸出No action specified.若參數是以「--」開頭(經過sys.startswith 獲取開頭),則從該參數的第3個字符起截取,好比--help,獲得的就是help若取得的值爲"help" 則顯示幫助信息,若取得的值爲"version",則顯示版本信息若沒有匹配到任何選項,則顯示「Unknown option」若直接加文件名,則打印出文件內容

相關文章
相關標籤/搜索