python sys模塊示例總結(jié)

先把常用命令粘出來方便查看

標(biāo)準(zhǔn)自帶模塊,不需要安裝
sys.argv 命令行參數(shù)List,第一個(gè)元素是程序本身路徑
sys.getdefaultencoding(): 獲取系統(tǒng)當(dāng)前編碼,一般默認(rèn)為ascii。
sys.setdefaultencoding(): 設(shè)置系統(tǒng)默認(rèn)編碼,執(zhí)行dir(sys)時(shí)不會看到這個(gè)方法,在解釋器中執(zhí)行不通過,可以先執(zhí)行reload(sys),在執(zhí)行 setdefaultencoding('utf8'),此時(shí)將系統(tǒng)默認(rèn)編碼設(shè)置為utf8。(見設(shè)置系統(tǒng)默認(rèn)編碼 )。
sys.getfilesystemencoding(): 獲取文件系統(tǒng)使用編碼方式,Windows下返回'mbcs',mac下返回'utf-8'.
sys.modules.keys() 返回所有已經(jīng)導(dǎo)入的模塊列表
sys.exc_info() 獲取當(dāng)前正在處理的異常類,exc_type、exc_value、exc_traceback當(dāng)前處理的異常詳細(xì)信息
sys.exit(n) 退出程序,正常退出時(shí)exit(0)
sys.hexversion 獲取Python解釋程序的版本值,16進(jìn)制格式如:0x020403F0
sys.version 獲取Python解釋程序的版本信息
sys.maxint 最大的Int值
sys.maxunicode 最大的Unicode值
sys.modules 返回系統(tǒng)導(dǎo)入的模塊字段,key是模塊名,value是模塊
sys.path 返回模塊的搜索路徑,初始化時(shí)使用PYTHONPATH環(huán)境變量的值
sys.platform 返回操作系統(tǒng)平臺名稱
sys.stdout 標(biāo)準(zhǔn)輸出
sys.stdin 標(biāo)準(zhǔn)輸入
sys.stderr 錯(cuò)誤輸出
sys.exc_clear() 用來清除當(dāng)前線程所出現(xiàn)的當(dāng)前的或最近的錯(cuò)誤信息
sys.exec_prefix 返回平臺獨(dú)立的python文件安裝的位置
sys.byteorder 本地字節(jié)規(guī)則的指示器,big-endian平臺的值是'big',little-endian平臺的值是'little'
sys.copyright 記錄python版權(quán)相關(guān)的東西
sys.api_version 解釋器的C的API版本

環(huán)境

python3.6
如果是在linux上直接運(yùn)行就好,如果是Windows上請安裝pycharm。
使用pycharm直接RUN運(yùn)行是不行的,需要調(diào)出終端命令行來運(yùn)行,點(diǎn)擊左下角PEP,選擇Terminal,如圖所示:

image.png
image.png

示例:

sys.argv()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
print(sys.argv[0])
print(sys.argv[1])

結(jié)果:

F:\python_test>python sys_test.py 20170920
sys_test.py
20170920

或者終端命令行直接運(yùn)行:

python -c "import sys;print(sys.argv[0]);print(sys.argv[1])" arg1

結(jié)果:

F:\python_test>python -c "import sys;print(sys.argv[0]);print(sys.argv[1])" arg1
-c
arg1
sys.exit()

0是正常退出,其他為異常

import sys

def exitfunc(value):
    print(value)
    sys.exit(0)

print("hello")

try:
    sys.exit(1)
except SystemExit as value:
    exitfunc(value)

print("come?")

結(jié)果:

hello
1

先打印hello,在執(zhí)行exit(1),拋異常把1傳給values,values在傳進(jìn)函數(shù)中執(zhí)行,打印1退出。
注:
python版本2和版本3的拋異常不一樣
python2中except SystemExit,value:
python3中except SystemExit as value:

sys.path
import sys

print(sys.path)

結(jié)果:

['F:\\python_test', 'F:\\python_test\\sys_test.py', 'F:\\anaconda3\\python36.zip', 'F:\\anaconda3\\DLLs', 'F:\\anaconda3\\lib', 'F:\\anaconda3', 'F:\\anaconda3\\lib\\site-packages', 'F:\\anaconda3\\lib\\site-packages\\Sphinx-1.5.1-py3.6.egg', 'F:\\anaconda3\\lib\\site-packages\\win32', 'F:\\anaconda3\\lib\\site-packages\\win32\\lib', 'F:\\anaconda3\\lib\\site-packages\\Pythonwin', 'F:\\anaconda3\\lib\\site-packages\\setuptools-27.2.0-py3.6.egg']

寫好的模塊可以放在上面的某個(gè)路徑,就可以正常的搜到了。
在import導(dǎo)入module_name時(shí),就是根據(jù)sys.path的路徑來搜索module.name,也可以自定義添加模塊路徑。

sys.path.append("自定義模塊路徑")
sys.modules

全局字典,每當(dāng)python啟動時(shí)該字段自動加載到內(nèi)存中。新加模塊sys.modules會自動記錄該模塊,第二次導(dǎo)入時(shí)直接從字典中加載,加快運(yùn)行速度。他擁有字典的一切方法。
keys是模塊名
values是模塊
modules返回路徑

import sys

print(sys.modules.keys())
print("``````````````")
print(sys.modules.values())
print("```````````````````")
print(sys.modules["os"]

結(jié)果:

dict_keys(['builtins', 'sys', '_frozen_importlib', '_imp', '_warnings', '_thread', '_weakref', '_frozen_importlib_external', '_io', 'marshal', 'nt', 'winreg', 'zipimport', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', 'io', 'abc', '_weakrefset', 'site', 'os', 'errno', 'stat', '_stat', 'ntpath', 'genericpath', 'os.path', '_collections_abc', '_sitebuiltins', 'sysconfig', '_bootlocale', '_locale', 'encodings.gbk', '_codecs_cn', '_multibytecodec', 'types', 'functools', '_functools', 'collections', 'operator', '_operator', 'keyword', 'heapq', '_heapq', 'itertools', 'reprlib', '_collections', 'weakref', 'collections.abc', 'encodings.cp437'])
--------------
dict_values([<module 'builtins' (built-in)>, <module 'sys' (built-in)>, <module '_frozen_importlib' (frozen)>, <module '_imp' (built-in)>, <module '_warnings' (built-in)>, <module '_thread' (built-in)>, <module '_weakref' (built-in)>, <module '_frozen_importlib_external' (frozen)>, <module 'io' (built-in)>, <module 'marshal' (built-in)>, <module 'nt' (built-in)>, <module 'winreg' (built-in)>, <module 'zipimport' (built-in)>, <module 'encodings' from 'F:\\anaconda3\\lib\\encodings\\__init__.py'>, <module 'codecs' from 'F:\\anaconda3\\lib\\codecs.py'>, <module '_codecs' (built-in)>, <module 'encodings.aliases' from 'F:\\anaconda3\\lib\\encodings\\aliases.py'>, <module 'encodings.utf_8' from 'F:\\anaconda3\\lib\\encodings\\utf_8.py'>, <module '_signal' (built-in)>, <module '__main__' from 'F:/python_test/sys_test.py'>, <module 'encodings.latin_1' from 'F:\\anaconda3\\lib\\encodings\\latin_1.py'>, <module 'io' from 'F:\\anaconda3\\lib\\io.py'>, <module 'abc' from 'F:\\anaconda3\\lib\\abc.py'>, <module '_weakrefset' from 'F:\\anaconda3\\lib\\_weakrefset.py'>, <module 'site' from 'F:\\anaconda3\\lib\\site.py'>, <module 'os' from 'F:\\anaconda3\\lib\\os.py'>, <module 'errno' (built-in)>, <module 'stat' from 'F:\\anaconda3\\lib\\stat.py'>, <module '_stat' (built-in)>, <module 'ntpath' from 'F:\\anaconda3\\lib\\ntpath.py'>, <module 'genericpath' from 'F:\\anaconda3\\lib\\genericpath.py'>, <module 'ntpath' from 'F:\\anaconda3\\lib\\ntpath.py'>, <module '_collections_abc' from 'F:\\anaconda3\\lib\\_collections_abc.py'>, <module '_sitebuiltins' from 'F:\\anaconda3\\lib\\_sitebuiltins.py'>, <module 'sysconfig' from 'F:\\anaconda3\\lib\\sysconfig.py'>, <module '_bootlocale' from 'F:\\anaconda3\\lib\\_bootlocale.py'>, <module '_locale' (built-in)>, <module 'encodings.gbk' from 'F:\\anaconda3\\lib\\encodings\\gbk.py'>, <module '_codecs_cn' (built-in)>, <module '_multibytecodec' (built-in)>, <module 'types' from 'F:\\anaconda3\\lib\\types.py'>, <module 'functools' from 'F:\\anaconda3\\lib\\functools.py'>, <module '_functools' (built-in)>, <module 'collections' from 'F:\\anaconda3\\lib\\collections\\__init__.py'>, <module 'operator' from 'F:\\anaconda3\\lib\\operator.py'>, <module '_operator' (built-in)>, <module 'keyword' from 'F:\\anaconda3\\lib\\keyword.py'>, <module 'heapq' from 'F:\\anaconda3\\lib\\heapq.py'>, <module '_heapq' (built-in)>, <module 'itertools' (built-in)>, <module 'reprlib' from 'F:\\anaconda3\\lib\\reprlib.py'>, <module '_collections' (built-in)>, <module 'weakref' from 'F:\\anaconda3\\lib\\weakref.py'>, <module 'collections.abc' from 'F:\\anaconda3\\lib\\collections\\abc.py'>, <module 'encodings.cp437' from 'F:\\anaconda3\\lib\\encodings\\cp437.py'>])
--------------
<module 'os' from 'F:\\anaconda3\\lib\\os.py'>
sys.stdin\stdout\stderr

Python程序的標(biāo)準(zhǔn)輸入/輸出/出錯(cuò)流定義在sys模塊中,分別 為: sys.stdin, sys.stdout, sys.stderr
標(biāo)準(zhǔn)輸入輸出:

import sys
print('Hi, %s!' % input('Please enter your name:'))

python2的raw_input和python3的input
結(jié)果:

F:\anaconda3\python.exe F:/python_test/sys_test.py
Please enter your name:ly
Hi, ly!
stdin

程序效果同上:

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

結(jié)果:

Please enter your name:
lc
Hi, lc!
stdout
sys.stdout.write('Hello World!')

print('Hello World!')

結(jié)果:

Hello World!

打印sys.stdin, sys.stdout, sys.stderr

import sys
for f in (sys.stdin, sys.stdout, sys.stderr):
    print(f)

結(jié)果:

<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>
<_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
<_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>

可以看出stdin, stdout, stderr在Python中無非都是文件屬性的對象,他們在Python啟動時(shí)自動與Shell 環(huán)境中的標(biāo)準(zhǔn)輸入,輸出,出錯(cuò)關(guān)聯(lián)。
而Python程序的在Shell中的I/O重定向與DOS命令的重定向完全相同,其實(shí)這種重定向是由Shell來提供的,與Python 本身并無關(guān)系。那么我們是否可以在Python程序內(nèi)部將stdin,stdout,stderr讀寫操作重定向到一個(gè)內(nèi)部對象呢?答案是肯定的。
Python提供了一個(gè)StringIO模塊來完成這個(gè)設(shè)想,比如:

重定向到一個(gè)內(nèi)部對象

可以在Python程序內(nèi)部將stdin,stdout,stderr讀寫操作重定向到一個(gè)內(nèi)部對象,使用StringIO模塊。

import sys
from io import StringIO
import sys
buff =StringIO()

temp = sys.stdout                               #保存標(biāo)準(zhǔn)I/O流
sys.stdout = buff                                 #將標(biāo)準(zhǔn)I/O流重定向到buff對象
print(42, 'hello', 0.001)

sys.stdout =temp                                 #恢復(fù)標(biāo)準(zhǔn)I/O流
print(buff.getvalue())

StringIO模塊在python自帶
python2.x中from StringIO import String
還有一個(gè)用c實(shí)現(xiàn)的比他還快from cStringIO import StringIO
python3.x中,StringIO在io模塊中了from io import StringIO

結(jié)果:

42 hello 0.001
reload

對已經(jīng)加載過得模塊進(jìn)行重新加載,一般原模塊有變化等特殊情況,reload前該模塊必須已經(jīng)import過.
原來已經(jīng)使用的實(shí)例還是會使用舊模塊,而新生產(chǎn)的實(shí)例會使用新的模塊,reload后還是用原來的內(nèi)存地址。

import os
reload(os)

特例:

import sys     
sys.setdefaultencoding('utf8') 

引用會出錯(cuò),因?yàn)閟etdefaultencoding函數(shù)在被系統(tǒng)調(diào)用后被刪除了,所以通過import引用進(jìn)來時(shí)其實(shí)已經(jīng)沒有了,所以必須reload一次sys模塊,這樣setdefaultencoding才會為可用,

import sys    
reload(sys)   
sys.setdefaultencoding('utf8')    
del sys.setdefaultencoding   ##刪除原來的setdefaultencoding函數(shù)     
sys.setdefaultencoding('gb2312')  

python安裝目錄的Lib文件夾下,有一個(gè)叫site.py的文件【python2.6】,在里面可以找到main() --> setencoding()-->sys.setdefaultencoding(encoding),因?yàn)檫@個(gè)site.py每次啟動python解釋器時(shí)會自動加載,所以main函數(shù)每次都會被執(zhí)行,setdefaultencoding函數(shù)一出來就已經(jīng)被刪除了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容