代码之家  ›  专栏  ›  技术社区  ›  Luke Thistlethwaite

传递Python的多处理.值对象转换为ctype函数?

  •  0
  • Luke Thistlethwaite  · 技术社区  · 6 年前

    我的python代码如下所示:

    #main.py
    import ctypes, glob
    from multiprocessing import Value
    
    libfile = glob.glob('build/*/mod_func*.so')[0]
    mylib = ctypes.CDLL(libfile)
    
    test_value = Value("i", -99)
    mylib.mod_func.argtypes = [ctypes.c_int]
    
    print(test_value.value)
    mylib.mod_func(test_value.value)
    print(test_value.value)
    

    //testcode.cpp
    extern "C"
    void mod_func(int &val)
    {
       val = 10;
    }
    

    我用命令构建C++代码 python setup.py build ,其中设置.py具体如下:

    from setuptools import setup, Extension
    setup(
       ext_modules=[Extension('mod_func', ['testcode.cpp'],),],
    )
    

    main.py ,我得到的输出是:

    -99
    Segmentation fault (core dumped)
    

    这个错误可能是因为我想通过 Value.value 但我不知道还能做什么。我不能只使用ctype函数返回的值,因为我的主要python代码将在线程中运行,并在ctype函数完成执行之前的某个时间强制终止,所以我希望迭代更新传递给ctype函数的值,当线程终止时可以查看该值。

    有什么想法吗?

    0 回复  |  直到 6 年前
        1
  •  0
  •   Luke Thistlethwaite    6 年前

    我用回调函数找到了我想要的功能。

    #main.py
    import ctypes, glob
    from multiprocessing import Value
    
    libfile = glob.glob('build/*/mod_func*.so')[0]
    mylib = ctypes.CDLL(libfile)
    
    test_value = Value("i", -99)
    print("Before:", test_value.value)
    @ctypes.CFUNCTYPE(None, ctypes.c_int)
    def callback(new_val):
       test_value.value = new_val
    
    mylib.mod_func(callback, 10)
    print("After:", test_value.value)
    

    更新C++代码:

    extern "C"
    void mod_func(void (*f)(int), int val)
    {
       f(val);
    }
    

    输出:

    Before: -99
    After: 10