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)後面的內容就不會執行了,因為程式已經退出