如何在运行python脚本时阻止shell获取输入(键盘)?

时间:2016-12-05 11:36:49

标签: python bash shell

我使用 python 2.5.2

bash 中运行脚本

该脚本在shell上转储一些报告。

如何冻结 shell,并防止它在运行脚本时被输入密钥(或任何其他键)中断?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您想要禁用用户键盘输入的回声吗?

您可以使用以下命令禁用键盘回显:

stty -echo

并再次启用它:

stty echo

(但是你无法看到你输入的内容)

答案 1 :(得分:0)

更复杂的实现方法是在线程中运行它,并将输出写入文件。

这是如何在一个线程中实现的。

import time
from threading import Thread

def noInterrupt():
    f = open('/path/to/filename.txt','w+')
    for i in xrange(4):
        f.write(i)
        time.sleep(1)
    f.close()

a = Thread(target=noInterrupt)
a.start()
a.join()
print "done"

如果特定用例要求您获取锁定,则代码低于here

class KeyboardLocker:

    def __init__(self, serio=0):
        self._on = False
        self.serio = serio

    def on(self):
        return self._on

    def write_value(self,path, value):
        with open(path, "a") as f:
            f.write(value)

    def toggle(self):
        if self.on():
            self.turn_off()
        else:
            self.turn_on()

    def description(self):
        path = '/sys/devices/platform/i8042/serio%d/description' % (self.serio,)
        with open(path, "r") as f:
            description = f.read()
        return description

    def turn_on(self):
        try:
            self.write_value('/sys/devices/platform/i8042/serio%d/bind_mode' % (self.serio,),
                            'auto')
        except IOError, e:
            self._on = False
            raise
        else:
            self._on = True
        return self.on()

    def turn_off(self):
        try:
            self.write_value('/sys/devices/platform/i8042/serio%d/bind_mode' % (self.serio,),
                            'manual')
            self.write_value('/sys/devices/platform/i8042/serio%d/drvctl' % (self.serio,),
                            'psmouse')
        except IOError, e:
            self._on = True
            raise
        else:
            self._on = False
        return self.on()

if __name__ == "__main__":
    kl = KeyboardLocker(serio=0)

    device = kl.description()
    print "We got a lock on", device

    proceed = raw_input("Do you want to proceed? (y/n)").lower().startswith("y")
    import sys
    if not proceed: sys.exit(1)

    kl.turn_off()

    import time
    wait = 5
    print "Sleeping few seconds...", wait
    time.sleep(wait)
    print "Voila!"

    kl.turn_on()

    raw_input("Does it work now?")