2011-12-21 3 views
2

У меня есть автономный модуль Python, используемый для анализа некоторых исходных данных. Модуль работает отлично.Как получить/получить C struct из Python

Теперь мне нужен вывод, сгенерированный модулем Python в источнике C, который будет выполнять дальнейшую обработку на выходе.

Вот примерное представление потока:

  1. источник C будет вызывать модуль Python.
  2. Модуль Python заполнит результаты, сгенерированные в структуру C, и , затем каким-то образом передаст его в источник C.

Итак, каков наилучший способ получить результаты из модуля Python в исходном коде C?

Должен ли я использовать что-то вроде следующего, чтобы заполнить результаты?

from ctypes import * 
class result(Structure):  
    _fields_ = [("status", c_int), ...] 
+0

Не самый красивый способ, но я думаю, что самый простой способ - вывести выходной файл модуля python во временный файл, а затем прочитать файл в C. – wim

+0

Я думаю, что это должен быть последний способ? – MA1

ответ

3

Я не думаю, что вы хотите использовать модуль ctypes - это модуль для доступа к DLL, и общие объекты из кода Python, а не наоборот.

Вы не указали, как программа C будет вызывать модуль Python. Будет ли

  • вызвать сценарий Python, используя что-то вроде popen от C? Если это так, то вы можете записать данные в stdout в Python и правильно интерпретировать данные в C. Вам нужно будет разработать для этого свой собственный небольшой протокол. Это может быть ad-hoc-протокол, или вы можете использовать существующие форматы, такие как JSON, для которых вы найдете библиотеки для C и Python.

  • embed the Python VM in your C program? Затем вам необходимо преобразовать значения C в соответствующие Py* значений и поместить их в PyTuple, который можно передать в качестве аргумента функции Python, из C. Выход функции Python будет PyObject, который вам нужно будет распаковать (в C), чтобы получить данные.

В обоих случаях вам нужно будет сделать упаковку и распаковать себя.

+0

Большое спасибо. В настоящее время я использую popen для вызова скрипта python. Поскольку мне нужно быстрое решение, поэтому я буду читать/записывать данные из stdout. – MA1