Я работаю с функцией python, которая получает объект Value из многопроцессорной библиотеки python, переданной в него, и нуждается в использовании функции 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;
}
Я создал код C ++ с помощью команды python setup.py build
, где 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 будет запущен в потоке и принудительно завершен в какой-то момент до завершения выполнения функции ctype, поэтому я хочу итеративно обновить значение передается в функцию ctype, которая может быть просмотрена после завершения потока.
Есть идеи?