Передача объекта multiprocessing.Value в функцию ctype? - PullRequest
0 голосов
/ 25 января 2020

Я работаю с функцией 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, которая может быть просмотрена после завершения потока.

Есть идеи?

1 Ответ

0 голосов
/ 25 января 2020

Мне удалось найти нужную функциональность с помощью функции обратного вызова.

Обновлен 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...