У меня есть программа, написанная на 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-программу?
Абсолютно. Создать «поддельный» модуль в программе C вводится в sys.modules
что код Python может импортировать и получать к нему доступ, как и любой другой модуль.
Мне лично очень нравится библиотека 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 и передача данных и структур данных между ними.