sys 模塊提供了許多函數和變量來處理 Python 運行時環境的不同部分.
處理命令行參數
在解釋器啟動后, argv 列表包含了傳遞給腳本的所有參數, 列表的第一個元素為腳本自身的名稱.
使用sys模塊獲得腳本的參數
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!"
如果把腳本作為字符串傳遞給python (使用 -c 選項), 腳本名會被設置為 "-c".
處理模塊
path 列表是一個由目錄名構成的列表, Python 從中查找擴展模塊( Python 源模塊, 編譯模塊,或者二進制擴展).
啟動 Python 時,這個列表從根據內建規則, PYTHONPATH 環境變量的內容, 以及注冊表( Windows 系統)等進行初始化.
由于它只是一個普通的列表, 你可以在程序中對它進行操作,
使用sys模塊操作模塊搜索路徑
sys.path.insert(0, "samples") #將路徑插入到path,[0]中
import sample
sys.path = [] #刪除path中所有路徑
import random
使用sys模塊查找內建模塊
builtin_module_names 列表包含 Python 解釋器中所有內建模塊的名稱
dump("os")
dump("sys")
dump("string")
dump("strop")
dump("zlib")
os => C:/python/lib/os.pyc
sys => <BUILTIN>
string => C:/python/lib/string.pyc
strop => <BUILTIN>
zlib => C:/python/zlib.pyd
使用sys模塊查找已導入的模塊
modules 字典包含所有加載的模塊. import 語句在從磁盤導入內容之前會先檢查這個字典.
Python 在處理你的腳本之前就已經導入了很多模塊.
['os.path', 'os', 'exceptions', '_ _main_ _', 'ntpath', 'strop', 'nt',
'sys', '_ _builtin_ _', 'site', 'signal', 'UserDict', 'string', 'stat']
使用sys模塊獲得當前平臺
sys.platform 返回當前平臺 出現如: "win32" "linux2" 等
處理標準輸出/輸入
標準輸入和標準錯誤 (通??s寫為 stdout 和 stderr) 是內建在每一個 UNIX 系統中的管道。
當你 print 某些東西時,結果前往 stdout 管道;
當你的程序崩潰并打印出調試信息 (例如 Python 中的 traceback (錯誤跟蹤)) 的時候,信息前往 stderr 管道
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 是一個類文件對象;調用它的 write 函數可以打印出你給定的任何字符串。
實際上,這就是 print 函數真正做的事情;它在你打印的字符串后面加上一個硬回車,然后調用 sys.stdout.write 函數。
在最簡單的例子中,stdout 和 stderr 把它們的輸出發送到相同的地方
和 stdout 一樣,stderr 并不為你添加硬回車;如果需要,要自己加上。
stdout 和 stderr 都是類文件對象,但是它們都是只寫的。
它們都沒有 read 方法,只有 write 方法。然而,它們仍然是類文件對象,因此你可以將其它任何 (類) 文件對象賦值給它們來重定向其輸出。
使用sys重定向輸出
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
向標準錯誤寫入錯誤信息是很常見的,所以有一種較快的語法可以立刻導出信息
entering function
在這里,你可以將單個print語句重定向到stderr而且不用影響后面的print語句。
使用sys模塊退出程序
注意 sys.exit 并不是立即退出. 而是引發一個 SystemExit 異常. 這意味著你可以在主程序中捕獲對 sys.exit 的調用
捕獲sys.exit調用
hello
there
如果準備在退出前自己清理一些東西(比如刪除臨時文件), 你可以配置一個 "退出處理函數"(exit handler), 它將在程序退出的時候自動被調用
另一種捕獲sys.exit調用的方法
sys.exitfunc = exitfunc # 設置捕獲時調用的函數
print "hello"
sys.exit(1) # 退出自動調用exitfunc()后,程序依然退出了
print "there" # 不會被 print
hello
world
新聞熱點
疑難解答