sys模塊和os模塊是很常用的模塊,我們應(yīng)該熟悉它的用法。
sys模塊
sys.argv
獲取命令行參數(shù),返回值是List,第一個(gè)元素是程序本身
例子:
創(chuàng)建文件test.py,內(nèi)容如下:
import sys
print(sys.argv)
在命令行中運(yùn)行,測試文件。
[alphababy@AlphaBaby] py3test$ python3 test.py
['test.py']
[alphababy@AlphaBaby] py3test$ python3 test.py
['test.py']
[alphababy@AlphaBaby] py3test$ python3 test.py 33
['test.py', '33']
看這樣一個(gè)有趣的小程序,程序的功能是計(jì)算第一個(gè)參數(shù)的值,并返回
修改test.py文件如下:
import sys
print(eval(sys.argv[1]))
然后在命令行中調(diào)用解釋器執(zhí)行test.py文件:
[alphababy@AlphaBaby] py3test$ python3 test.py 1+3
4
sys.exit(n)
程序退出,如果是正常退出是sys.exit(0),這里的參數(shù)可以自己填,但是對于程序是怎樣退出的應(yīng)該傳參是幾,應(yīng)該自己定義好,這樣別人在運(yùn)行你的程序的時(shí)候才知道你是怎樣退出的,是正餐退出還是意外退出。
例子:
import sys
print('hello')
sys.exit(0)
print('python')
運(yùn)行程序后發(fā)現(xiàn)在,程序輸出hello后并沒有繼續(xù)輸出python。因?yàn)樵趫?zhí)行到sys.exit(0)的時(shí)候程序就結(jié)束了。
sys.version
獲取Python解釋程序的版本信息
sys.maxsize
獲取最大的Int值
sys.path
返回模塊的搜索路徑,初始化時(shí)使用PYTHONPATH環(huán)境變量的值
比如就是我們在python源文件中import引入模塊的時(shí)候就會(huì)在sys.path的目錄中查找相應(yīng)的模塊,如果在這里面的目錄中沒有找到你要倒入的模塊則會(huì)報(bào)錯(cuò)。
返回值是一個(gè)list則我們?nèi)绻氲谷胍粋€(gè)自定義模塊下面的的包或者是模塊則可以使用list的append方法在PYTHONPATH環(huán)境變量中增加相應(yīng)的路徑。
sys.platform
返回操作系統(tǒng)的名稱
sys.stdout, sys.stdin, sys.stderror
分別和輸出輸入,錯(cuò)誤輸出相關(guān)
sys.stdout.write(str)
sys.stdout.write和print 都是輸出相關(guān)的函數(shù)print內(nèi)部也是調(diào)用的sys.stdout,sys.stdout默認(rèn)輸出是屏幕。
import sys
s = 'test stdout'
print('--')
sys.stdout.write(s)
print('--')
class A(object):
pass
print(A)
sys.stdout.write(A)
print 什么類型都可以輸出,但是sys.stdout.write只可以輸出字符串類型,否則報(bào)錯(cuò)。print默認(rèn)是最后換行,但是sys.stdout.write默認(rèn)不換行。
下面看我在百度找到的別人大佬寫的一段代碼:
import sys
file = sys.stdout # 存儲(chǔ)原始的輸出對象
sys.stdout = open('1.txt', 'w') # 重定向所有的寫入內(nèi)容到 1.txt 文件,
print('Citizen_Wang') # 寫入到 1.txt 文件中,在上一行語句中改變了輸出流到文件中
print('Always fall in love with neighbours') # 繼續(xù)寫入到文件中
sys.stdout.close() # 其實(shí)就是 open 文件之后的關(guān)閉
sys.stdout = file # 將 print 命令的結(jié)果返回給控制臺(tái)
print('輸出信息返回在控制臺(tái)') # 該信息會(huì)在控制臺(tái)也顯示
下面講一個(gè)有趣的實(shí)例(python實(shí)現(xiàn)命令行進(jìn)度提示):
特別是在使用linux下載依賴或者軟件的時(shí)候,都會(huì)提示一個(gè)百分?jǐn)?shù)的進(jìn)度,這種進(jìn)度提示是怎么實(shí)現(xiàn)的呢?
我猜你肯定知道\n, \t, \d等轉(zhuǎn)移字符,但是你應(yīng)該不知道、\r這個(gè)轉(zhuǎn)移字符,這個(gè)轉(zhuǎn)移字符有什么用呢?看如下代碼:
import time
import sys
for i in range(20):
print("個(gè)測試數(shù)據(jù)" + str(i), end="")
sys.stdout.flush() # 刷新緩沖區(qū)
time.sleep(1)
sys.stdout.flush()的作用請看這里:https://blog.csdn.net/qq_20603001/article/details/62887099
這是一個(gè)簡單的不能再簡單的代碼了,但是注意這里一直沒有輸出換行,接著看下面的代碼,感受其中\r的作用:
import time
import sys
for i in range(20):
if i%5 == 0:
print("\r", end="")
print("個(gè)測試數(shù)據(jù)" + str(i), end="")
sys.stdout.flush()
time.sleep(1)
當(dāng)我們輸出\r的時(shí)候,在一行中并且在\r前的所有字符將被清理掉。修改下代碼繼續(xù)運(yùn)行測試:
import time
import sys
for i in range(20):
if i%5 == 0:
print("\r", end="")
print("個(gè)測試數(shù)據(jù)" + str(i)) # 去掉了, end="",末尾會(huì)打印出換行
sys.stdout.flush()
time.sleep(1)
當(dāng)出現(xiàn)換行時(shí),并不會(huì)清理掉在\r字符前的內(nèi)容,所以\r只會(huì)清理掉只在一行中的內(nèi)容。
補(bǔ)充, 這樣更能理解
import time
import sys
for i in range(20):
print("\r", end="")
time.sleep(1)
print("個(gè)測試數(shù)據(jù)" + str(i), end="")
sys.stdout.flush()
time.sleep(1)
我們清楚了\r的用法那就可以實(shí)現(xiàn)一個(gè)命令行進(jìn)度提示了:
import sys
import time
print("downloading:")
def view_bar(num, total):
rate = float(num) / float(total)
rate_num = int(rate * 100)
r = "\r"+("="*(2*rate_num//10)+">")+(" "*(20-2*rate_num//10))+'%d%%' % (rate_num, )
sys.stdout.write(r)
sys.stdout.flush() # 刷新緩沖區(qū)
if __name__ == '__main__':
for i in range(0, 101):
time.sleep(0.01)
view_bar(i, 100)
print("\ndownload successful\n")