簡體   English   中英

防止在Python /終端運行函數期間使用命令行?

[英]Prevent Command Line Usage During Function Run in Python/Terminal?

我正在使用Terminal運行帶有一系列打印語句(由time.sleep函數分隔)的python腳本。

如果我要在10秒鍾內打印各種項目,那么我希望能夠防止用戶在這段時間內向命令行輸入新命令。

在Terminal中可以嗎? 有解決方法嗎?



我在這里的目標是能夠為用戶提供許多打印說明,然后讓他們在提出問題后才回答問題。

因為我不想讓用戶不知所措,所以我想延遲打印語句的時間,使其看起來更易於管理(嗯,這確實是為了戲劇效果)。

for i in range(10):
    print "Eating cheeseburger..."
    time.sleep(1)

response = raw_input("What is your favorite color?")
if response == "blue":
    blah blah blah etc.

現在,用戶可以在提出問題之前以及仍在吃芝士漢堡的過程中輸入響應。 我想防止這種情況。

這個問題是針對特定平台的,因為不同的操作系統對標准輸入和輸出的處理方式不同。 我將嘗試回答您的Linux問題:

您可以使用os.system來訪問linux命令stty -echo使在終端上輸入的任何文本stty -echo可見,而stty echo使它再次可見。

接下來要實現的是在詢問用戶輸入時清除stdin緩沖區。 這可以通過termios函數tcflush來實現,該函數可用於刷新終端已經接收但尚未讀取的所有輸入。

import os
import time
import termios
import sys

os.system("stty -echo")
for i in range(10):
    print(i)
    time.sleep(1)
os.system("stty echo")

termios.tcflush(sys.stdin, termios.TCIOFLUSH)

print(raw_input("Answer now:"))

以下是使用ctypes為Windows控制台編寫的Saurabh Shirodkar答案的版本。

import sys
import msvcrt
import ctypes

kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)

ENABLE_ECHO_INPUT = 0x0004

def _check_bool(result, func, args):
    if not result:
        raise ctypes.WinError(ctypes.get_last_error())
    return args

kernel32.GetConsoleMode.errcheck = _check_bool
kernel32.GetConsoleMode.argtypes = (ctypes.c_void_p,
    ctypes.POINTER(ctypes.c_ulong))
kernel32.SetConsoleMode.errcheck = _check_bool
kernel32.SetConsoleMode.argtypes = (ctypes.c_void_p, ctypes.c_ulong)
kernel32.FlushConsoleInputBuffer.errcheck = _check_bool
kernel32.FlushConsoleInputBuffer.argtypes = (ctypes.c_void_p,)

def echo_input(enable=True, conin=sys.stdin):
    h = msvcrt.get_osfhandle(conin.fileno())
    mode = ctypes.c_ulong()
    kernel32.GetConsoleMode(h, ctypes.byref(mode))
    if enable:
        mode.value |= ENABLE_ECHO_INPUT
    else:
        mode.value &= ~ENABLE_ECHO_INPUT
    kernel32.SetConsoleMode(h, mode)

def flush_input(conin=sys.stdin):
    h = msvcrt.get_osfhandle(conin.fileno())
    kernel32.FlushConsoleInputBuffer(h)

if __name__ == '__main__':
    import time

    if sys.version_info[0] == 2:
        input = raw_input

    echo_input(False)

    for i in range(10):
        print(i)
        time.sleep(1)

    echo_input(True)
    flush_input()

    print(input("Answer now: "))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM