avatar

RWO.cc

读一次写一次

  • 首页
  • 搭建手册
  • 笔记
  • 短视频
  • 关于
  • 🌈200粉丝🌈
Home Python中断方法执行
文章

Python中断方法执行

Posted 2024-04-19 Updated 2024-04- 19
By RWO.
6~8 min read

实现方式

使用信号(适用于Unix/Linux系统)

Python的signal模块允许你处理Unix信号。以下是一个使用signal模块来捕捉中断信号(如Ctrl+C,即SIGINT)并优雅地中断程序的示例:

import signal
import time

# 假设的函数,接受一个参数
def long_running_task(param):
    for i in range(10):
        if not should_run:
            print("任务被手动中断")
            break
        print(f"执行任务 {param} 步骤 {i+1}")
        time.sleep(1)

# 全局变量控制是否继续运行
should_run = True

# 信号处理函数
def handle_sigint(signum, frame):
    global should_run
    print("收到中断信号,准备退出...")
    should_run = False  # 修改标志,使得函数可以优雅地结束

# 注册信号处理函数
signal.signal(signal.SIGINT, handle_sigint)

try:
    long_running_task("重要计算")
except Exception as e:
    print("发生异常:", e)

当你在程序运行期间按下Ctrl+C时,handle_sigint函数会被调用,然后通过抛出SystemExit异常来终止程序。

使用多线程和标志

如果你的程序是多线程的,可以在主线程中设置一个标志来控制其他线程的执行。以下是一个使用标志来控制线程执行的示例:

import threading
import time

should_continue = True

def task(param):
    while should_continue:
        print(f"线程正在运行,参数为 {param}...")
        time.sleep(1)
    print("线程已停止")

# 启动线程,传递参数
param = "示例参数"
thread = threading.Thread(target=task, args=(param,))
thread.start()

# 主线程等待用户输入,以决定是否终止子线程
input("按回车键结束线程运行...")
should_continue = False  # 改变标志,使线程可以退出循环
thread.join()  # 等待线程真正结束
print("主线程退出")

在这个示例中,用户按下回车键后,should_continue标志被设置为False,这会使得在task函数中的循环退出,从而停止线程的执行。

注意:thread.join() 是Python中线程(Thread)对象的一个方法,它用于阻塞调用它的线程(通常是主线程),直到被调用 .join() 的线程终止。

可能会报错

将Word文档转换为PDF失败:(-2147221008, '尚未调用 CoInitialize。', None, None)

尚未调用 CoInitialize

解决方案:

可以通过在每个需要使用 COM 对象的线程开始处调用 pythoncom.CoInitialize() 来解决这个问题。这样做可以确保 COM 库在该线程中被正确初始化。

import threading
import pythoncom
import win32com.client

def convert_doc_to_pdf(input_path, output_path):
    pythoncom.CoInitialize()  # 初始化 COM 环境
    try:
        word = win32com.client.Dispatch("Word.Application")
        doc = word.Documents.Open(input_path)
        doc.SaveAs(output_path, FileFormat=17)  # 17 是 PDF 格式的常数
        doc.Close()
        word.Quit()
    except Exception as e:
        print(f"转换失败: {e}")
    finally:
        pythoncom.CoUninitialize()  # 清理 COM 环境

def worker(input_path, output_path):
    print("开始转换")
    convert_doc_to_pdf(input_path, output_path)
    print("转换完成")

# 输入和输出文件路径
input_path = 'path_to_your_doc.docx'
output_path = 'output_path_to_save_pdf.pdf'

# 创建并启动线程
t = threading.Thread(target=worker, args=(input_path, output_path))
t.start()
t.join()  # 等待线程完成

注意:使用 pythoncom.CoInitialize() 来初始化线程的 COM 环境,并在不再需要 COM 对象时调用 pythoncom.CoUninitialize() 进行清理。

笔记
Python 学习
License:  CC BY 4.0
Share

Further Reading

Oct 29, 2024

halo代码注入——实现悬浮展示当前文章二维码 和 自定义主题字体

文章页面悬浮在二维码标志上面,就会把当前页面链接变成二维码并且展示出来,我当前使用的主题没有,所以写此文章记录一下。 效果展示 悬浮二维码效果展示 自定义字体效果展示 代码注入位置 代码一:悬浮二维码 原始<

Aug 26, 2024

Tortoise ORM - values()和value_list()

django: values()与values_list() from django.db import models class Blog(models.Model): name = models.CharField(max_length=100) tagline = model

Aug 25, 2024

tortoise orm 执行原生 SQL 查询

Tortoise ORM 提供了多种方式来执行 SQL 查询。 使用 execute_query_dict 方法执行查询,并以字典的形式返回查询结果: from tortoise.backends.asyncpg import client from typing import List, Opti

OLDER

Python 转换繁简字体

NEWER

Deepcopy 太慢

Recently Updated

  • 什么是 python 的闭包
  • 使用argparse模块解析命令行参数
  • Python中的二维码生成与解析(花里胡哨)
  • Python中的二维码生成与解析(基础使用)
  • 使用platform模块获取系统信息

Trending Tags

学习 Git 工具 SQL docker-compose 每日一点 快捷键 Flink fastapi Windows

Contents

©2025 RWO.cc. Some rights reserved.

Using the Halo theme Chirpy