程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Python標准庫之Sys模塊使用詳解

Python標准庫之Sys模塊使用詳解

編輯:更多關於編程

       這篇文章主要介紹了Python標准庫之Sys模塊使用詳解,本文講解了使用sys模塊獲得腳本的參數、處理模塊、使用sys模塊操作模塊搜索路徑、使用sys模塊查找內建模塊、使用sys模塊查找已導入的模塊等使用案例,需要的朋友可以參考下

      sys 模塊提供了許多函數和變量來處理 Python 運行時環境的不同部分.

      處理命令行參數

      在解釋器啟動後, argv 列表包含了傳遞給腳本的所有參數, 列表的第一個元素為腳本自身的名稱.

      使用sys模塊獲得腳本的參數

       代碼如下:

      print "script name is", sys.argv[0] # 使用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!"

      如果是從標准輸入讀入腳本 (比如 "python < sys-argv-example-1.py"), 腳本的名稱將被設置為空串.

      如果把腳本作為字符串傳遞給python (使用 -c 選項), 腳本名會被設置為 "-c".

      處理模塊

      path 列表是一個由目錄名構成的列表, Python 從中查找擴展模塊( Python 源模塊, 編譯模塊,或者二進制擴展).

      啟動 Python 時,這個列表從根據內建規則, PYTHONPATH 環境變量的內容, 以及注冊表( Windows 系統)等進行初始化.

      由於它只是一個普通的列表, 你可以在程序中對它進行操作,

      使用sys模塊操作模塊搜索路徑

      代碼如下:

      print "path has", len(sys.path), "members"

      sys.path.insert(0, "samples") #將路徑插入到path,[0]中

      import sample

      sys.path = [] #刪除path中所有路徑

      import random

      使用sys模塊查找內建模塊

      builtin_module_names 列表包含 Python 解釋器中所有內建模塊的名稱

      代碼如下:

      def dump(module):

      print module, "=>",

      if module in sys.builtin_module_names: #查找內建模塊是否存在

      print ""

      else:

      module = _ _import_ _(module) #非內建模塊輸出模塊路徑

      print module._ _file_ _

      dump("os")

      dump("sys")

      dump("string")

      dump("strop")

      dump("zlib")

      os => C:pythonlibos.pyc

      sys =>

      string => C:pythonlibstring.pyc

      strop =>

      zlib => C:pythonzlib.pyd

      使用sys模塊查找已導入的模塊

      modules 字典包含所有加載的模塊. import 語句在從磁盤導入內容之前會先檢查這個字典.

      Python 在處理你的腳本之前就已經導入了很多模塊.

      代碼如下:

      print sys.modules.keys()

      ['os.path', 'os', 'exceptions', '_ _main_ _', 'ntpath', 'strop', 'nt',

      'sys', '_ _builtin_ _', 'site', 'signal', 'UserDict', 'string', 'stat']

      使用sys模塊獲得當前平台

      sys.platform 返回當前平台 出現如: "win32" "linux2" 等

      處理標准輸出/輸入

      標准輸入和標准錯誤 (通常縮寫為 stdout 和 stderr) 是內建在每一個 UNIX 系統中的管道。

      當你 print 某些東西時,結果前往 stdout 管道;

      當你的程序崩潰並打印出調試信息 (例如 Python 中的 traceback (錯誤跟蹤)) 的時候,信息前往 stderr 管道

       代碼如下:

      >>> 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 是一個類文件對象;調用它的 write 函數可以打印出你給定的任何字符串。

      實際上,這就是 print 函數真正做的事情;它在你打印的字符串後面加上一個硬回車,然後調用 sys.stdout.write 函數。

      在最簡單的例子中,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語句。

      使用sys模塊退出程序

       代碼如下:

      import sys

      sys.exit(1)

      注意 sys.exit 並不是立即退出. 而是引發一個 SystemExit 異常. 這意味著你可以在主程序中捕獲對 sys.exit 的調用

      捕獲sys.exit調用

      代碼如下:

      import sys

      print "hello"

      try:

      sys.exit(1)

      except SystemExit: # 捕獲退出的異常

      pass # 捕獲後不做任何操作

      print "there"

      hello

      there

      如果准備在退出前自己清理一些東西(比如刪除臨時文件), 你可以配置一個 "退出處理函數"(exit handler), 它將在程序退出的時候自動被調用

      另一種捕獲sys.exit調用的方法

      復制代碼 代碼如下:

      def exitfunc():

      print "world"

      sys.exitfunc = exitfunc # 設置捕獲時調用的函數

      print "hello"

      sys.exit(1) # 退出自動調用exitfunc()後,程序依然退出了

      print "there" # 不會被 print

      hello

      world

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved