Python常用模組之sys

weixin_34391854發表於2018-02-24

sys模組提供了一系列有關Python執行環境的變數和函式。

常見用法

  • sys.argv
    可以用sys.argv獲取當前正在執行的命令列引數的引數列表(list)。
變數解釋
sys.argv[0] 當前程式名
sys.argv[1] 第一個引數
sys.argv[0] 第二個引數

參考程式碼:

# encoding: utf-8
# filename: argv_test.py
import sys

# 獲取指令碼名字
print 'The name of this program is: %s' %(sys.argv[0])
# 獲取引數列表
print 'The command line arguments are:'
for i in sys.argv:
    print i
# 統計引數個數
print 'There are %s arguments.'%(len(sys.argv)-1)

執行結果:

E:\p>python argv_test.py arg1 arg2 arg3
The name of this program is: argv_test.py
The command line arguments are:
argv_test.py
arg1
arg2
arg3
There are 3 arguments.
  • sys.platform

獲取當前執行環境的平臺,如win32表示是Windows 32bit作業系統,linux2表示是linux平臺;

# linux 
>>> import sys
>>> sys.platform
'linux2'

# windows
>>> import sys
>>> sys.platform
'win32'
  • sys.path

path是一個目錄列表,供Python從中查詢第三方擴充套件模組。在python啟動時,sys.path根據內建規則、PYTHONPATH變數進行初始化。

>>> sys.path
['', 'E:\\Python27\\Lib\\idlelib', 'C:\\Windows\\system32\\python27.zip', 'E:\\Python27\\DLLs', 'E:\\Python27\\lib', 'E:\\Python27\\lib\\plat-win', 'E:\\Python27\\lib\\lib-tk', 'E:\\Python27', 'E:\\Python27\\lib\\site-packages']

有時候為了讓python能夠找到我們自己定義的模組,需要修改sys.path的內容,比如:

# 在path的開始位置 插入test
>>> sys.path.insert(0,'test')
>>> sys.path
['test', '', 'E:\\Python27\\Lib\\idlelib', 'C:\\Windows\\system32\\python27.zip', 'E:\\Python27\\DLLs', 'E:\\Python27\\lib', 'E:\\Python27\\lib\\plat-win', 'E:\\Python27\\lib\\lib-tk', 'E:\\Python27', 'E:\\Python27\\lib\\site-packages']
# 可以成功import test
>>> import test
# 找不到 other 這個模組
>>> import other
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    import other
ImportError: No module named other
# 需要新增path
>>> sys.path.insert(0,'other')
>>> import other

也可以用sys.path.append(“mine module path”)來新增自定義的module。

  • sys.builtin_module_names

sys.builtin_module_names返回一個列表,包含內建模組的名字。如:

>>> import sys
>>> print sys.builtin_module_names
('__builtin__', '__main__', '_ast', '_bisect', '_codecs', '_codecs_cn', '_codecs_hk', '_codecs_iso2022', '_codecs_jp', '_codecs_kr', '_codecs_tw', '_collections', '_csv', '_functools', '_heapq', '_hotshot', '_io', '_json', '_locale', '_lsprof', '_md5', '_multibytecodec', '_random', '_sha', '_sha256', '_sha512', '_sre', '_struct', '_subprocess', '_symtable', '_warnings', '_weakref', '_winreg', 'array', 'audioop', 'binascii', 'cPickle', 'cStringIO', 'cmath', 'datetime', 'errno', 'exceptions', 'future_builtins', 'gc', 'imageop', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'strop', 'sys', 'thread', 'time', 'xxsubtype', 'zipimport', 'zlib')

程式碼示例:

# encoding: utf-8
# find_module.py

import sys

# print sys.builtin_module_names

def find_module(module):
    if module in sys.builtin_module_names:
        print module," => ","__builtin__"
    else:
        print module,"=> ",__import__(module).__file__


find_module('os')
find_module('sys')
find_module('strop')
find_module('zlib')
find_module('string')

# 執行結果:
>>> 
======================== RESTART: E:/p/find_module.py ========================
os =>  E:\Python27\lib\os.pyc
sys  =>  __builtin__
strop  =>  __builtin__
zlib  =>  __builtin__
string =>  E:\Python27\lib\string.pyc
  • sys.exit(n)

呼叫sys.exit(n)可以中途退出程式,當引數非0時,會引發一個SystemExit異常,從而可以在主程式中捕獲該異常。
看程式碼:

# encoding: utf-8
import sys

print 'running...'

try:
    sys.exit(1)
except SystemExit:
    print 'SystemExit exit 1'

print 'exited'

執行結果:

>>> 
======================= RESTART: E:/p/sys_exit_test.py =======================
running...
SystemExit exit 1
exited

 


 

常用方法:

1、 通過sys模組獲取程式引數

import sys

def usage():
    '''usage'''
    print 'Usage: %s %s %s %s' % (sys.argv[0], 'tokenid', 'Subject', 'Content')
    sys.exit()

def main():
    if len(sys.argv) != 4:
        usage()
    else:
        print(sys.argv[0])
        print(sys.argv[1])
        print(sys.argv[2])
        print(sys.argv[3])

if __name__ == "__main__":
    main()

執行指令碼:

D:\Python\modules>python os_modules.py
Usage: os_modules.py tokenid Subject Content

D:\Python\modules>python os_modules.py aa bb cc
os_modules.py
aa
bb
cc

python的sys模組預設是把第一個引數預設是程式本省,從第二個引數起都是程式碼後面跟著的引數,通過sys.arg[n]就可以獲得傳入到程式中的引數\


 

常用方法:

sys.stdin\stdout\stderr

功能:stdin , stdout , 以及stderr 變數包含與標準I/O 流對應的流物件. 如果需要更好地控制輸出,而print 不能滿足你的要求, 它們就是你所需要的. 你也可以替換它們, 這時候你就可以重定向輸出和輸入到其它裝置( device ), 或者以非標準的方式處理它們

sys.stdout 與print

當我們在 Python 中列印物件呼叫 print obj 時候,事實上是呼叫了sys.stdout.write(obj+'\n'),print 將你需要的內容列印到了控制檯,然後追加了一個換行符,print 會呼叫 sys.stdout 的 write 方法 以下兩行在事實上等價


import sys
sys.stdout.write("hello")
print('hello')

# hellohello

import sys
sys.stdout.write("hello \n")
print('hello')

# hello 
# hello

sys.stdin 與 raw_input

import sys
a = raw_input('raw_input_name: ')
print(a)
print 'stdin_name: ',
b = sys.stdin.readline()
print(b)

# raw_input_name: ;LIJUNJIANG
# ;LIJUNJIANG
# stdin_name: AAAA
# AAAA

從控制檯重定向到檔案

Import sys
f_handler=open('out.log', 'w')
sys.stdout=f_handler
print 'hello'

# 在當前檔案下新生成一個檔案out.log,檔案內容為hello, 

捕獲sys.exit(n)呼叫

功能:執行到主程式末尾,直譯器自動退出,但是如果需要中途退出程式,可以呼叫sys.exit函式,帶有一個可選的整數引數返回給呼叫它的程式,表示你可以在主程式中捕獲對sys.exit的呼叫。(0是正常退出,其他為異常)

def exitfunc():
    print "hello world"
sys.exitfunc = exitfunc  # 設定捕獲時呼叫的函式
print "This exit test"
sys.exit(1)     # 退出自動呼叫exitfunc()後,程式依然退出了
print "there"  # 不會被 print
結果:
This exit test
hello world

exitfunc()函式,及當執行sys.exit(1)的時候,呼叫exitfunc()函式 sys.exit(1)後面的內容就不會執行了,因為程式已經退出

相關文章