You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python调用C函数时阻止exit(1)终止Python程序

解决Python调用含exit()的C函数后进程终止的问题

问题背景

通过ctypes调用C函数时,该C函数在输入为3时会执行exit(1)终止进程,且无法修改C函数逻辑。尝试用线程隔离调用,但整个Python进程仍会被终止,期望跳过触发exit的情况后继续执行,最终输出包含0、1、2、4、5、6、7的内容(顺序可能因调度略有不同)。

相关代码

my_lib.c

#include <stdio.h>
#include <stdlib.h>
void c_func(int i)
{
    if(i == 3)
        exit(1);
    printf("%d", i);
}

原Python代码(无效)

from ctypes import *
import threading
lib = CDLL("my_lib.so")
for i in range(8):
    # 注:原代码args=(i)是错误写法,需加逗号构成元组,否则会报错
    thread = threading.Thread(target=lib.c_func, args=(i,))
    thread.start()

问题原因

exit(1)是终止整个进程的系统调用,而非仅终止当前线程。线程属于同一进程空间,因此无论哪个线程调用该C函数触发exit,整个Python进程都会被直接终止,线程无法实现隔离。

解决方案:用子进程替代线程

子进程拥有独立的进程空间,子进程内调用exit(1)只会终止自身,不会影响父进程。使用Python的multiprocessing模块实现隔离:

修改后的Python代码

from ctypes import *
import multiprocessing

lib = CDLL("./my_lib.so")

def call_c_func(i):
    lib.c_func(i)

if __name__ == "__main__":
    processes = []
    for i in range(8):
        p = multiprocessing.Process(target=call_c_func, args=(i,))
        processes.append(p)
        p.start()
    
    # 等待所有子进程执行完成
    for p in processes:
        p.join()

编译与运行

  1. 编译C库:
gcc -shared -fPIC my_lib.c -o my_lib.so
  1. 运行Python程序,会输出包含0、1、2、4、5、6、7的内容(顺序由进程调度决定,不会出现3,父进程会正常运行至结束)。

内容的提问来源于stack exchange,提问作者Eivind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 13:27:07