RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 578469
Accepted
Alexey Dudarev
Alexey Dudarev
Asked:2020-10-15 21:05:33 +0000 UTC2020-10-15 21:05:33 +0000 UTC 2020-10-15 21:05:33 +0000 UTC

进程中断和执行延迟

  • 772

告诉我如何从 python 中断 Windows 上的系统进程?假设代码执行到某个点,然后 Windows 启动一个必须停止的外部进程,然后才能继续执行代码。也对这个问题感兴趣,如何在执行下一个代码块之前添加延迟?

python
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    jfs
    2020-10-19T12:45:55Z2020-10-19T12:45:55Z

    要在指定时间后中断外部命令timeout,可以在启动时传递一个参数:

    import subprocess
    
    subprocess.check_call(command, timeout=timeout)
    

    如果command它没有在timeout几秒钟内完成,那么相应的进程就会被杀死并抛出subprocess.TimeoutExpired异常。有时这还不够,需要手动终止整个进程树,尤其是当您正在读取外部命令的输出时。下面是支持旧版本 Python (Python 2) 的示例代码,展示了如何在几秒钟后停止“永恒”的外部命令,并在其运行时累积其输出。如果您不想在执行命令时阻塞主线程,那么有很多方法可以异步地与命令交互,要查找不同情况的代码示例,请点击链接。

    如果命令在 Python 之外运行并且你想在给定时间后按名称终止它:

    process = get_process_by_name(name)
    try:
        process.wait(timeout)
    except TimeoutExpired:
        process.kill()
        process.wait()
    

    .wait()如果进程退出或超时(以先到者为准),则终止。这与它的subprocess.call() 实现方式非常接近。

    在 Python 中还有许多其他方法可以延迟函数的执行,例如,在timeout几秒钟内运行函数而不会一直阻塞主线程:

    import threading
    
    threading.Timer(timeout, kill_process_by_name, [name]).start()
    

    更多:time.sleep(timeout)要么time.sleep(interval - timer() % interval),要么Event.wait(timeout),或者使用来自适当事件循环(事件循环)的方法——选择什么取决于具体任务。通常,要中断 Python 中函数的执行,请参阅函数调用超时。

    如何通过名称查找进程并杀死它的实现示例:

    import psutil # $ pip install psutil
    
    def get_process_by_name(name):
        for proc in psutil.process_iter():
            try:
                if proc.name() == name:
                    return proc
            except psutil.NoSuchProcess:
                continue
        raise KeyError("Process {name!r} not found".format(name=name))
    
    def kill_process_by_name(name):
        get_process_by_name(name).kill()
    
    def kill_process_tree_by_name_windows(name):
        subprocess.call(['taskkill', '/im', name, '/f', '/t'])
    
    • 4
  2. vadim vaduxa
    2020-10-18T01:46:10Z2020-10-18T01:46:10Z
    import psutil
    import subprocess
    import time
    
    def proc_kill(proc_name):
        '''таск киллер'''
        for proc in psutil.process_iter():
            if proc.name() == proc_name:
                psutil.Process(proc.pid).kill()
                print('внешний процесс %s который надо остановить' % proc_name)
                break
    
    if __name__ == '__main__':
        proc = 'calc.exe'  # О процессе ,который надо завершить, известно его имя
    
        for r in range(5):
            print('Допустим, код выполняется до определенного момента')
            if r == 2:
                print('затем винда запускает внешний процесс %s' % proc)
                subprocess.Popen(proc)
    
                print('перед срабатыванием таск киллера необходима небольшая задержка')
                time.sleep(2)
    
                proc_kill(proc)  # таск киллер
    
                print('и лишь потом продолжить выполнение кода')
    

    出去:

    Допустим, код выполняется до определенного момента
    Допустим, код выполняется до определенного момента
    Допустим, код выполняется до определенного момента
    затем винда запускает внешний процесс calc.exe
    перед срабатыванием таск киллера необходима небольшая задержка
    внешний процесс calc.exe который надо остановить
    и лишь потом продолжить выполнение кода
    Допустим, код выполняется до определенного момента
    Допустим, код выполняется до определенного момента
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5