天天看點

Python文法學習記錄(3):程式暫停調試Python基礎之程式暫停實作類似密碼登入的效果

Python基礎之程式暫停

文章目錄

  • Python基礎之程式暫停
    • 方法一input()
    • 方法二time.sleep()
    • 方法三os.system("pause")
    • 方法四自己寫的小子產品可以實作按任意鍵繼續…
  • 實作類似密碼登入的效果

當我們執行某些程式時,由于機器速度很快導緻肉眼無法直接看到執行結果時程式便停止運作。這時候我們迫切需要在程式中暫停,專業術語叫做阻塞。下面列舉幾種常用的程式暫停方法:

方法一input()

用法:直接在欲等待處輸入input()即可。

print("waiting for input")
input()
print("continue")

           

result

Python文法學習記錄(3):程式暫停調試Python基礎之程式暫停實作類似密碼登入的效果

[外鍊圖檔轉存失敗(img-GSxx5Mzo-1567578483975)(https://i.loli.net/2019/04/14/5cb3209c80d24.png)]

特點:

  • 優點:不需要借助子產品,執行到此處阻塞等待人工輸入。
  • 缺點:程式結束時候需要強制結束或者在控制台輸入值。

方法二time.sleep()

用法:導入time子產品;在欲等待處輸入time.sleep(time)(time為數字,表示秒)即可。

import time
print("waiting for 10s")
time.sleep(10)
print("continue")
           

result

Python文法學習記錄(3):程式暫停調試Python基礎之程式暫停實作類似密碼登入的效果

[外鍊圖檔轉存失敗(img-QkaLTZZS-1567578483981)(https://i.loli.net/2019/04/14/5cb320338ba09.png)]

特點:

  • 優點:動态等待程式執行完畢,不需要強行終止,等待時間可調。
  • 缺點:需要導入子產品,等待規定時間結束後便繼續往下執行。

方法三os.system(“pause”)

用法:導入os子產品;在欲等待處輸入os.system(“pause”)即可。

import os
print("waiting for pause")
os.system("pause")
print("continue")
           

好像隻有在windows下才可以使用

特點:

  • 優點:不必強行終止;不必等待時間,可自由按下enter繼續。
  • 缺點:導入子產品,執行系統指令。

方法四自己寫的小子產品可以實作按任意鍵繼續…

功能有多大用途今天暫且不說,但我覺得應該有很多人也想在python下實作這個功能,這樣當自己寫的python程式運作時, 突然給出這麼一個提示,然後自己再來個帥氣的回車,我覺得肯定給人一種非常專業的感覺,最起碼自己肯定被自己迷倒了,是以今天我們就學習下這段代碼,這裡定義了一個函數,是以你可以嵌入到你的程式中,在任何你希望調用的地方調用它即可,使用非常的友善,代碼如下:

import os
import sys
import termios
def press_any_key_exit(msg):
# 擷取标準輸入的描述符
    fd = sys.stdin.fileno()
# 擷取标準輸入(終端)的設定
    old_ttyinfo = termios.tcgetattr(fd)
# 配置終端
    new_ttyinfo = old_ttyinfo[:]
# 使用非規範模式(索引3是c_lflag 也就是本地模式)
    new_ttyinfo[3] &= ~termios.ICANON
# 關閉回顯(輸入不會被顯示)
    new_ttyinfo[3] &= ~termios.ECHO
# 輸出資訊
    sys.stdout.write(msg)
    sys.stdout.flush()
# 使設定生效
    termios.tcsetattr(fd, termios.TCSANOW, new_ttyinfo)
# 從終端讀取
    os.read(fd, 7)
# 還原終端設定
    termios.tcsetattr(fd, termios.TCSANOW, old_ttyinfo)
if __name__ == "__main__":
    print("運作中...")
    press_any_key_exit("按任意鍵繼續...")
    print ("繼續運作中...")
           
Python文法學習記錄(3):程式暫停調試Python基礎之程式暫停實作類似密碼登入的效果

代碼不多解釋,看注釋,這裡要說一下termios子產品,這個子產品提供了一個接口可以控制tty終端的Io,它所有函數第一個參數需要一個檔案描述符,可以是整型的檔案描述符,也可以是個檔案對象,因為它可以控制在終端的顯示設定,常用場景就是使用者在終端輸入密碼時不要顯示出來,就跟我們用root登陸系統時系統給出輸入密碼提示符一樣, 代碼實作如下:

實作類似密碼登入的效果

如果密碼輸入不正确的時候将會進行循環

def getpass(prompt="Password: "):
    import termios, sys
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    new = termios.tcgetattr(fd)
    new[3] = new[3] & ~termios.ECHO
    try:
        termios.tcsetattr(fd, termios.TCSADRAIN, new)
        passwd = input(prompt)
        if passwd == '888':
            print("right")
            pass
        else:
            print(passwd)
            print("wrong")
            getpass()
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)
    return passwd
passwd = getpass()
           

最後一次輸入設定的正确密碼就可以了

(可以将這個檔案權限設定為他人不可讀哈哈哈)

Python文法學習記錄(3):程式暫停調試Python基礎之程式暫停實作類似密碼登入的效果