【问题标题】:How to prevent shell from getting input (keyboard) while running a python script? [duplicate]如何在运行 python 脚本时防止 shell 获取输入(键盘)? [复制]
【发布时间】:2016-12-05 21:24:53
【问题描述】:

我正在使用 python 2.5.2

bash 中运行脚本

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

如何冻结 shell,并防止它在运行脚本时被 enter key(或任何其他键)打断?

【问题讨论】:

    标签: python bash shell


    【解决方案1】:

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

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

    stty -echo
    

    然后再次启用它:

    stty echo
    

    (但是您无法看到您正在输入的内容)

    【讨论】:

      【解决方案2】:

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

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

      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?")
      

      【讨论】:

        猜你喜欢
        • 2017-02-24
        • 1970-01-01
        • 2019-08-26
        • 1970-01-01
        • 2019-06-17
        • 2016-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多