Python之sys模塊小探

Sys模塊函數之多,我只能選取本身認爲比較實用的一些函數列在此處。借馬雲找員工的說法,」找最合適的而不是最天才的,這句話,我我的以爲在不少方面都能適應,學習也不在話下。Sys模塊功能的確不少,但咱們應該將重點放在那些功能纔是最適合咱們的,爲此,我列的這些函數,就是我認爲比較適合我之後開發的函數。html

(1)sys.argvpython

不少人會想,我如何給個人程序在外部傳遞參數呢?這個,就能夠實現。如:linux

Tesy.pyshell

Import sys小程序

Print sys.argv[number]windows

通常狀況下,number0是這個腳本的名字,12…則爲命令行下傳遞的參數.如:app

Test.py腳本內容:ide

import sys函數

print sys.argv[0]學習

print sys.argv[1]

print sys.argv[2]

print sys.argv[3]

那麼

[root@databak scripts]# python test.py arg1 arg2 arg3

test.py

arg1

arg2

arg3

看到,對應的關係了嗎?還有,在python.org模塊參考手冊說,若是在命令行下選用-c那麼argv[0]= -c 看下,

[root@databak scripts]# python -c "import sys;print sys.argv[0];print sys.argv[1]" arg1

-c

arg1

若是你們不明白,能夠參考下man python

SYNOPSIS

      python [ -d ] [ -E ] [ -h ] [ -i ] [ -m module-name ] [ -O ]

              [ -Q argument ] [ -S ] [ -t ] [ -u ]

              [ -v ] [ -V ] [ -W argument ] [ -x ]

              [ -c command | script | - ] [ arguments ]

(2)sys.platform

你們都知道,當今的程序比較流行的是跨平臺。簡單的說就是這段程序既能夠在windows下,換到linux下也能夠不加修改的運行起來,聽起來就不錯。因此,這個函數就能夠派上用場了。

假設,咱們想實現一個清除終端,linux下用clear, windows下用cls

Ostype=sys.platform()

If ostype==」linux」 or ostype==」linux2」:

Cmd=」clear」

Else:

  Cmd=」cls」

(3) sys.exit(n)

執行至主程序的末尾時,解釋器會自動退出. 可是若是須要中途退出程序, 你能夠調用sys.exit 函數, 它帶有一個可選的整數參數返回給調用它的程序. 這意味着你能夠在主程序中捕獲對sys.exit 的調用。(注:0是正常退出,其餘爲不正常,可拋異常事件供捕獲!)

import sys

def exitfunc(value):

    '''Clear function'''

    print value

    sys.exit(0)

print "hello"

try:

    sys.exit(1)

except SystemExit,value:

    exitfunc(value)

print "come?"

輸出結果:

[root@databak scripts]# python test.py

hello

1

如下是python.org庫參考手冊中,摘抄來的,供參考。

Exit from Python. This is implemented by raising the SystemExitexception, so cleanup actions specified by finally clauses of try statements are honored, and it is possible to intercept the exit attempt at an outer level. The optional argument arg can be an integer giving the exit status (defaulting to zero), or another type of object. If it is an integer, zero is considered 「successful termination」 and any nonzero value is considered 「abnormal termination」 by shells and the like. Most systems require it to be in the range 0-127, and produce undefined results otherwise. Some systems have a convention for assigning specific meanings to specific exit codes, but these are generally underdeveloped; Unix programs generally use 2 for command line syntax errors and 1 for all other kind of errors. If another type of object is passed, None is equivalent to passing zero, and any other object is printed to sys.stderrand results in an exit code of 1. In particular, sys.exit("some error message") is a quick way to exit a program when an error occurs.

大概意思是說,sys.exitpython程序中退出,將會產生一個systemExit異常,能夠爲此作些清除除理的工做。這個可選參數默認正常退出狀態是0,以數值爲參數的範圍爲:0-127。其餘的數值爲非正常退出,還有另外一種類型,在這裏展示的是strings對象類型。

(4)sys.path

你們對模塊都有必定了解吧?你們在使用模塊的某一個功能前,是否是須要導入呢?答案是須要。那import,__import__命令就不用提幹嗎的了吧。那你們在執行import module_name的時候,python內部發生了什麼呢?簡單的說,就是搜索module_name。根據sys.path的路徑來搜索module.name

>>> sys.path

['', '/usr/local/lib/python24.zip', '/usr/local/lib/python2.4', '/usr/local/lib/python2.4/plat-freebsd4', '/usr/local/lib/python2.4/lib-tk', '/usr/local/lib/python2.4/lib-dynload', '/usr/local/lib/python2.4/site-packages']

你們之後寫好的模塊就能夠放到上面的某一個目錄下,即可以正確搜索到了。固然你們也能夠添加本身的模塊路徑。Sys.path.append(「mine module path」).

(5)sys.modules

This is a dictionary that maps module names to modules which have already been loaded. This can be manipulated to force reloading of modules and other tricks.

Python.org手冊裏已經說的很明白了。

For names in sys.modules.keys():

If names != ’sys’:

    ……

(6)sys.stdin,sys.stdout,sys.stderr

stdin , stdout , 以及stderr 變量包含與標準I/O 流對應的流對象. 若是須要更好地控制輸出,print 不能知足你的要求, 它們就是你所須要的. 你也能夠替換它們, 這時候你就能夠重定向輸出和輸入到其它設備( device ), 或者以非標準的方式處理它們

從網上摘抄的文章,供你們參考:

#testing stdout

print 'Hello World!'
運行hello.py就會在標準輸出的屏幕上打印 Hello World!, 咱們再編一個簡單的標準輸入的小程序 sayhi.py:
#testing stdin

print 'Hi, %s!' % raw_input('Please enter your name:')
當你用鍵盤輸入你的名字後,程序在屏幕上輸出Hi[你的名字]!, 這就是從標準輸入:鍵盤獲取信息,再輸出到標準輸出:屏幕的例子。
那麼上面的例子中print raw_input是如何與標準輸入/輸出流創建關係的呢?
其實Python程序的標準輸入/輸出/出錯流定義在sys模塊中,分別 爲: sys.stdin, sys.stdout, sys.stderr
上面的程序分別與下列的程序是同樣的:
import sys

sys.stdout.write('Hello World!')
import sys

print 'Please enter your name:',
name=sys.stdin.readline()[:-1]
print 'Hi, %s!' % name

那麼sys.stdin, sys.stdout, stderr究竟是什麼呢?咱們在Python運行環境中輸入如下代碼:
import sys
for f in (sys.stdin, sys.stdout, sys.stderr): print f
輸出爲:
<open file '<stdin>', mode 'r' at 892210>
<open file '<stdout>', mode 'w' at 892270>
<open file '<stderr>', mode 'w at 8922d0>

由此能夠看出stdin, stdout, stderrPython中無非都是文件屬性的對象,他們在Python啓動時自動Shell 環境中的標準輸入,輸出,出錯關聯。
Python程序的在Shell中的I/O重定向與本文開始時舉的DOS命令的重定向徹底相同,其實這種重定向是由Shell來提供的,與Python 自己並沒有關係。那麼咱們是否能夠在Python程序內部將stdin,stdout,stderr讀寫操做重定向到一個內部對象呢?答案是確定的。
Python提供了一個StringIO模塊來完成這個設想,好比:
from StringIO import StringIO
import sys
buff =StringIO()

temp = sys.stdout                               #保存標準I/O
sys.stdout = buff                                 #將標準I/O流重定向到buff對象
print 42, 'hello', 0.001

sys.stdout =temp                                 #恢復標準I/O
print buff.getvalue()


若是想了解更多,請關注咱們的公衆號
公衆號ID:opdevos
掃碼關注

gongzhouhao.jpg

相關文章
相關標籤/搜索