Python中断方法执行
实现方式
使用信号(适用于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()
进行清理。
License:
CC BY 4.0