Наиболее базовый c IP C между Python и C ++ - PullRequest
0 голосов
/ 27 февраля 2020

Я пишу DLL (Windows, MS VS 17) на C ++, которая требует вызова сценария Python в какой-то момент - она ​​должна прочитать строку, кодированную json, обработать ее и вернуть json кодированный результат. Нет необходимости в асинхронном режиме или «скорости света», но мне нужен более или менее быстрый отклик - т.е. в течение 1-5 секунд макс. Вот подходы, которые я рассмотрел, и комментарии:

  1. Передайте строку в качестве аргумента командной строки . Это, очевидно, не лучший выбор - не говоря уже о предельной длине строки.
  2. Использовать временный файл . В моем случае будет лучше избегать такой практики, потому что, хотя мне нужно запускать Python -часть обычно один раз за запуск, число запусков может быть довольно большим.
  3. Используйте сокет TCP / IP (для localhost) / pipe . И то и другое кажется излишним для такой задачи - у меня нет постоянного потока данных, который постоянно меняется. Кроме того, в Windows это может быть болезненно.
  4. Использовать разделяемую память . Общая память была бы хорошим вариантом, но я не смог найти способ использовать один и тот же сегмент как в C ++, так и в Python.
  5. Вставить Python часть в C ++ . У меня есть 2 проблемы здесь: а) Python ENV должен быть установлен на целевой машине, не так ли? б) У скрипта python есть import, который импортирует пакет, установленный из pip, и, к сожалению, я не могу этого избежать. Есть ли правильный способ работы с импортом при встраивании?

Есть ли простой способ взаимодействия между C ++ и Python в моем случае?

1 Ответ

2 голосов
/ 27 февраля 2020

Поскольку вы нацеливаетесь на Windows, вариант (2) является лучшим, но используйте временный файл CreateFile(...FILE_ATTRIBUTE_TEMPORARY). Это эффективно разделяемая память (на уровне ОС, обе управляются диспетчером виртуальной памяти), но вы получаете семантику файлов.

...