Вставить Python HTTP-сервер в C-программу как RPC-сервер?

У меня есть программа, написанная на C ++ с веб-интерфейсом для целей RPC. я могу позвонить http://localhost/ListVariables или же http://localhost/RunFunction?var=1 и иметь код C для выполнения ListVariables или RunFunction. Это работает, но я бы предпочел не управлять веб-сервером на C / C ++, когда существует так много хороших веб-серверов Python.

То, что я представляю себе, — это вызов программы на C на Python для запуска веб-сервера в другом потоке (то есть Tornado), возврата к C, а затем продолжения выполнения вычислений. Затем, когда сервер Python получает запрос на http://localhost/ListVariablesэто вызывает назад в C и выполняет ListVariables на уже запущенном процессе.

C -----> processing -----------> processing ------------> RPC: FuncA -------->
|                                                        ^        |
\---> Python Web Server ---------- Request for: FuncA --/   ...   \-------->
^
browser: http://localhost/FuncA ---/

У проекта есть неудачное предостережение, что программа должна быть запущена из C для начала. После некоторого исследования это выглядит как пограничный случай, так как Python -> C и C -> Python можно сделать с помощью Cython. Однако я не могу найти много ресурсов на C -> Python -> C, так как большинство примеров, которые я нашел, описывают ссылки на библиотеки, а не на уже запущенные процессы. Можно ли заставить Python перезвонить в работающую C-программу?

2

Решение

Абсолютно. Создать «поддельный» модуль в программе C вводится в sys.modules что код Python может импортировать и получать к нему доступ, как и любой другой модуль.

1

Другие решения

Мне лично очень нравится библиотека boost :: python для встроенного python в c ++ и работы с привязкой данных и обратными вызовами между ними. http://www.boost.org/doc/libs/1_51_0/libs/python/doc/

При этом, то, что вы предлагаете, звучит как что-то вроде PITA. Я лично имел большой успех, используя http://libevent.org/ чтобы удовлетворить мои потребности встроенного веб-сервера. Он обрабатывает все вещи http-сервера для вас, все, что вам нужно сделать, это дать ему URL-адреса, которые вы хотите обработать, и обратный вызов, поставить event_base_loop где-нибудь в вашем главном цикле (или в его собственном потоке, если хотите), и вы уходите. Мне кажется, что это может быть намного проще, чем встраивание Python и передача данных и структур данных между ними.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector