程序性地发送键盘中断

7 投票
4 回答
6154 浏览
提问于 2025-04-17 03:22

有一个应用程序需要一个键盘中断。请问我怎么能通过程序发送一个键盘中断呢?我需要这个功能来实现自动化。就像按下 <C-c><C-x> 一样。

KeyboardInterrupt 

4 个回答

1

我建议用以下的代码模式来解决这个问题。我用它来程序化地启动一个tensorboard服务器,并在它所属的对象被删除时,通过发送CTRL-C来关闭它。一般来说,这个方法适用于任何需要发送键盘中断的子进程示例:

  1. 导入signal和subprocess模块。

    import signal
    import subprocess 
    
  2. 使用subprocess.Popen创建子进程。重要的是:要把creationflags参数设置为subprocess.CREATE_NEW_PROCESS_GROUP。这样做是为了后面能够发送键盘中断事件。

    command= <enter your command that is supposed to be run in different process as a string> 
    process = subprocess.Popen(command.split(),stdout=subprocess.PIPE,stdin=subprocess.PIPE,creationflags=subprocess.CREATE_NEW_PROCESS_GROUP) 
    
  3. 在你想发送键盘中断的地方,执行以下操作:

    process.send_signal(signal.CTRL_C_EVENT)
    

就这样!想了解为什么popen的creationflags参数要这样设置,可以查看官方的subprocess文档


以下是我示例代码的具体样子:

import signal
import subprocess
import time

class ExperimentTracker():
   
     def __init__(self):
         self.tensorboard_process=None

     def __del__(self):
         #shutdown tensorboard server and terminate process
         self.tensorboard_process.send_signal(signal.CTRL_C_EVENT)
         time.sleep(0.2)
         self.tensorboard_process.kill()

     def launch_tensorboard(self):
         #launch tensorboard
         bashCommand= "tensorboard --logdir runs" 
         self.tensorboard_process = subprocess.Popen(bashCommand.split(),stdout=subprocess.PIPE,stdin=subprocess.PIPE,creationflags=subprocess.CREATE_NEW_PROCESS_GROUP) 
         time.sleep(2) #sleep for 2 seconds to give tensorboard time to be launched
         
1

因为你提到自动化,我猜你是想在Python中使用SendKeys功能。你可以试试这个链接: http://rutherfurd.net/python/sendkeys/

4

在一个单独的线程中运行的代码,可以通过调用 thread.interrupt_main() 来在主线程中产生一个 KeyboardInterrupt。这个操作会让主线程像是收到了一个键盘中断的信号。

撰写回答