Вызов python из программы на c ++ для распространения - PullRequest
41 голосов
/ 08 сентября 2008

Я хотел бы вызвать файлы сценариев Python из моей программы на С ++.

Я не уверен, что у людей, которым я буду распространять, будет установлен Python.

В основном я ищу .lib-файл, который я могу использовать, который имеет лицензию на распространение, подобную Apache.

Ответы [ 6 ]

63 голосов
/ 30 ноября 2008

Я хотел бы вызвать файлы сценариев Python из моей программы на C ++.

Это означает, что вы хотите встроить Python в свое приложение C ++. Как упоминалось в Встраивание Python в другое приложение :

Встраивание Python аналогично расширяя его, но не совсем. Разница в том, что когда вы расширяете Python, основная программа приложение по-прежнему Python переводчик, а если встроить Python, основная программа может иметь не имеет ничего общего с Python - вместо этого, некоторые части приложения изредка вызывать питона интерпретатор для запуска некоторого кода Python.

Я предлагаю вам сначала пройти Встраивание Python в другое приложение . Затем обратитесь к следующим примерам

  1. Встраивание Python в C / C ++: Часть I

  2. Встраивание Python в C / C ++: Часть II

  3. Встраивание Python в многопоточные приложения C / C ++

Если вам нравится Boost.Python , вы можете перейти по следующим ссылкам:

  1. Встраивание Python с Boost.Python Часть 1
29 голосов
/ 08 сентября 2008

Boost имеет библиотеку интерфейса Python, которая может вам помочь.

Boost.Python

3 голосов
/ 08 сентября 2008

Внедрение интерпретатора Python в ваше приложение C ++ позволит вам запускать программы Python, используя в своем приложении скрипты Python. Эти сценарии также упростят вызов функций C ++ в вашем приложении. Если это то, что вам нужно, то библиотека Boost, упомянутая ранее, может помочь вам создать ссылку. В прошлом я использовал SWIG для генерации интерфейсов Python для кода C ++. Из вашего вопроса не было ясно, хотели ли вы, чтобы скрипты Python вызывали вашу программу на C ++, или вы просто хотели, чтобы C ++ вызывал Python.

Многие из функций Python используют модули, которые не встроены в интерпретатор Python. Если ваши скрипты Python вызывают эти функции, то вам нужно будет либо установить Python для ваших пользователей, либо включить файлы времени выполнения python в ваше приложение. Это будет зависеть от того, какие модули вы импортируете в свои скрипты Python.

2 голосов
/ 15 ноября 2018

Интересно, что никто еще не упомянул pybind11 . Из их документации:

pybind11 - это легкая библиотека только для заголовков, которая предоставляет типы C ++ в Python и наоборот, в основном для создания привязок Python существующих C ++ код. Его цели и синтаксис похожи на отличные Библиотека Boost.Python Дэвида Абрахамса: свести к минимуму стандартный код в традиционных модулях расширения путем вывода информации о типе с использованием Самоанализ времени компиляции. [...] С момента своего создания, эта библиотека имеет вырос за пределы Boost.Python во многих отношениях, что привело к резкому более простой обязательный код во многих распространенных ситуациях.

Конкретно, вызов функции Python (называемой встраиванием) настолько прост (взят из документации ):

#include <pybind11/embed.h> // everything needed for embedding
namespace py = pybind11;

int main() {
    py::scoped_interpreter guard{}; // start the interpreter and keep it alive
    py::print("Hello, World!"); // use the Python API
}
2 голосов
/ 08 сентября 2008

Boost - это, пожалуй, лучший выбор, однако, если вы хотите что-то более автономное, и если это для использования с Windows (что представляется возможным, учитывая, что они люди с наименьшей вероятностью установили Python), то вы можете используйте py2exe для создания DLL с точками входа, подходящими для COM-объектов. Затем вы можете взаимодействовать с библиотекой через COM. (Очевидно, что это совсем не полезно в качестве кроссплатформенного решения).

1 голос
/ 27 января 2019

Используйте системный вызов для запуска скрипта Python из C ++

#include<iostream>
#include <cstdlib>
using namespace std;
int main ()
{
int result = system("/usr/bin/python3 testGen1.py 1");
cout << result; 
}
...