带有lcms2 ctypes绑定和线程的Segfault

时间:2016-01-19 14:40:00

标签: python multithreading ctypes

首先,请原谅我以前是否已经得到了解答...我很擅长查找信息,但由于我的编程技巧非常基础,我可能不会理解那里有什么...

我正在尝试使用Python进行颜色转换。我以前使用lcms1的Python绑定,但由于没有lcms2的官方绑定,我试着用ctypes和ctypesgen运气。 我使用了ctypesgen.py -llcms2 /usr/include/lcms2.h /usr/include/lcms2_plugin.h -o lcms2.py并删除了所有.value(),因为它不起作用。

这一切都很精彩(对于我相当简单的需求),除非涉及线程...... 以下是示例代码:

from multiprocessing.dummy import Pool 
from lcms2 import *

DblTriplet = c_double * 3

def Lab2RGB(values):
    context = cmsCreateContext(None, None)
    inprof = cmsCreateLab4ProfileTHR(context, None)
    outprof = cmsCreate_sRGBProfileTHR(context)
    inbuf = DblTriplet(*values)
    outbuf = DblTriplet()
    xform = cmsCreateTransformTHR(context, inprof, TYPE_Lab_DBL, 
                               outprof, TYPE_RGB_DBL,
                               INTENT_PERCEPTUAL, 0)

    cmsCloseProfile(inprof)
    cmsCloseProfile(outprof)

    cmsDoTransform(xform, byref(inbuf), byref(outbuf), 1)
    cmsDeleteTransform(xform)
    cmsDeleteContext(context)

    return tuple(outbuf)

Lab = ((88.98,-1.31,110.87),
       (87.55,2.18,109.06),
       (60.81,65.68,85.06),
       (58.66,70.05,51.19),
       (55.26,72.14,43.46),
       (43.8,79.35,12.7),
       (51.55,78.77,-13.89),
       (47.52,68.9,-42.48),
       (18.74,54.58,-69.51),
       (17.5,42.9,-76.01),
       (14.92,31.84,-67.1),
       (47.57,-33.39,-53.38),
       (57.74,-77.16,0.18),
       (17.06,1.29,2.54),
       )

pool = Pool()
pool.map(Lab2RGB, Lab)
pool.close() 
pool.join()

我实际上在PyQt应用程序中使用它,所以我使用QThread但它也崩溃了Python线程。我还使用了threading,但最后使用了multiprocessing.dummy,以便与multiprocessing进行比较。我也尝试了“非THR”lcms2功能,同样的问题。我尝试了ctypesgen以及h2py

所以我的问题是:我的线程实现有什么问题吗?我读过你必须小心使用ctypes和线程,但却无法理解我能做些什么......

我试过了valgrind python thatscript.py,但是那个人说话的方式超出了我的头脑,但奇怪的是它不会出现段错...

0 个答案:

没有答案