将multiprocessing.Value对象传递给ctype函数?

问题描述 投票:0回答:1

我正在使用一个python函数,该函数从传递给它的python多处理库中获取Value对象,并需要使用ctype函数对其进行修改。问题是我找不到一个好的方法,而且不确定是否可以将Value对象传递给ctype函数,以便对值进行修改。

我的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)

我正在构建的C ++代码看起来像这样:

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

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

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

当我运行main.py时,得到的输出是:

-99
Segmentation fault (core dumped)

该错误可能是由于我试图将Value.value传递给我的ctype函数引起的,但是我不确定我还能做什么。我不能只使用ctype函数返回的值,因为我的主要python代码将在Thread中运行,并在ctype函数完成执行之前的某个时刻被强制终止,所以我想迭代地更新传递给终止线程时可以查看的ctype函数。

有什么想法吗?

python c++ ctypes python-multiprocessing
1个回答
0
投票

通过使用回调函数,我设法找到了想要的功能。

更新的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)
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
© www.soinside.com 2019 - 2024. All rights reserved.