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?等。
sys.argv????獲取參數(shù)
參數(shù)獲取從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
執(zhí)行結(jié)果:
[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
sys.platform???獲取當前操作系統(tǒng)平臺
具體的返回值如下:
>>>?import?sys
>>>?sys.platform
'linux2'
操作系統(tǒng)?返回值
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'
?
實例:
根據(jù)不同操作系統(tǒng)判斷該使用什么命令,例如在在linux?下用“clear”而在windows下用“cls”
#!/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
sys.exit(n)????????設置退出返回值(0表示正常退出,其他非0整數(shù)表示不正常,可以通過異常捕獲)
?
#!/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
sys.path??????返回模塊的搜索路徑,初始化時使用PYTHONPATH環(huán)境變量的值
在通過命令"import?module_name"時,系統(tǒng)將在以下路徑中查找導入的模塊,其中第一個為空,表示當前目錄
>>>?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()????獲取系統(tǒng)當前編碼,一般默認為ascii。
>>>?import?sys
>>>?sys.getdefaultencoding()
'ascii'
sys.setdefaultencoding()????設置系統(tǒng)默認編碼
執(zhí)行dir(sys)時不會看到這個方法,在解釋器中執(zhí)行不通過,可以先執(zhí)行reload(sys),再執(zhí)行?setdefaultencoding('utf8'),此時將系統(tǒng)默認編碼設置為utf8。
>>>?reload(sys)
<module?'sys'?(built-in)>
>>>?sys.setdefaultencoding('utf8')
?
sys.getfilesystemencoding()????獲取文件系統(tǒng)使用編碼方式
>>>?sys.getfilesystemencoding()
'UTF-8'
?
sys.stdin,sys.stdout,sys.stderr
標準輸入和標準錯誤?(通常縮寫為?stdout?和?stderr)?是內(nèi)建在每一個?UNIX?系統(tǒng)中的管道。?
當你?print?某些東西時,結(jié)果前往?stdout?管道;
當你的程序崩潰并打印出調(diào)試信息?(例如?Python?中的?traceback?(錯誤跟蹤))?的時候,信息前往?stderr?管道?
stdout?是一個類文件對象;調(diào)用它的?write?函數(shù)可以打印出你給定的任何字符串。
實際上,這就是?print?函數(shù)真正做的事情;它在你打印的字符串后面加上一個硬回車,然后調(diào)用?sys.stdout.write?函數(shù)。
>>>?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?把它們的輸出發(fā)送到相同的地方
和?stdout?一樣,stderr?并不為你添加硬回車;如果需要,要自己加上。
stdout?和?stderr?都是類文件對象,但是它們都是只寫的。
它們都沒有?read?方法,只有?write?方法。然而,它們?nèi)匀皇穷愇募ο?#xff0c;因此你可以將其它任何?(類)?文件對象賦值給它們來重定向其輸出。
?
使用sys重定向輸出
print?'Dive?in'?????????????????#?標準輸出
saveout?=?sys.stdout????????????#?在重定向前保存stdout,這樣的話之后你還可以將其設回正常
fsock?=?open('out.log',?'w')????#?打開一個新文件用于寫入。如果文件不存在,將會被創(chuàng)建。如果文件存在,將被覆蓋。
sys.stdout?=?fsock??????????????#?所有后續(xù)的輸出都會被重定向到剛才打開的新文件上。
print??'This?message?will?be?logged?instead?of?displayed'????#?這樣只會將輸出結(jié)果“打印”到日志文件中;屏幕上不會看到輸出
sys.stdout?=?saveout????????????#?在我們將?stdout?搞亂之前,讓我們把它設回原來的方式。?????
fsock.close()???????????????????#?關閉日志文件。
重定向錯誤信息
fsock?=?open('error.log',?'w')???????????????????#?打開你要存儲調(diào)試信息的日志文件。?
sys.stderr?=?fsock???????????????????????????????#?將新打開的日志文件的文件對象賦值給stderr以重定向標準錯誤。
raise?Exception,?'this?error?will?be?logged'?????#?引發(fā)一個異常,沒有在屏幕上打印出任何東西,所有正常的跟蹤信息已經(jīng)寫進error.log
?
還要注意你既沒有顯式關閉日志文件,也沒有將?stderr?設回最初的值。
這樣挺好,因為一旦程序崩潰?(由于引發(fā)的異常),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)
?
執(zhí)行結(jié)果:
[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?函數(shù)逐行讀取文件,執(zhí)行腳本后,判斷參數(shù)。
若參數(shù)長度小于2(命令本身占一個長度,也就是說,命令+參數(shù)),輸出No?action?specified.
若參數(shù)是以“--”開頭(通過sys.startswith?獲取開頭),則從該參數(shù)的第3個字符起截取,比如--help,得到的就是help
若取得的值為"help"?則顯示幫助信息,若取得的值為"version",則顯示版本信息
若沒有匹配到任何選項,則顯示“Unknown?option”
若直接加文件名,則打印出文件內(nèi)容
?
轉(zhuǎn)載于:https://blog.51cto.com/pmghong/1358168
總結(jié)
以上是生活随笔為你收集整理的Python 学习笔记 (8)—— sys模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 织梦改变模板目录
- 下一篇: websocket python爬虫_p