Вызов Python из программы на c ++ для распространения

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

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

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


person Brian R. Bondy    schedule 08.09.2008    source источник
comment
Возможный дубликат вызова C / C ++ из Python?   -  person Trevor Boyd Smith    schedule 25.04.2019


Ответы (6)


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

Boost.Python

person roo    schedule 08.09.2008

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

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

Встраивание 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
person bhadra    schedule 30.11.2008
comment
Это не работает ни с одной версией Visual Studio после 2008 года, так как это то, с чем скомпилирован python для Windows. Это возможно, если вы найдете или сможете сами скомпилировать версию python, используя более позднюю среду выполнения. Я только что потратил день, пытаясь скомпилировать python с использованием vs 2013, но безуспешно. - person David; 29.04.2014
comment
Мне удалось создать библиотеку для встраивания с помощью VS 2015. Это не так уж сложно, но выяснение шагов было разочаровывающим. stackoverflow.com/questions/48545255/ - person Jiminion; 26.04.2018
comment
Это означает, что вы хотите встроить Python в свое приложение C ++ ... - не обязательно. Он вполне может захотеть запустить внешний процесс и дождаться его. - person jww; 01.04.2019
comment
последняя ссылка не работает - person joel; 30.11.2019

Интересно, что еще никто не упомянул 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
}
person ingomueller.net    schedule 15.11.2018
comment
Вау, мне посчастливилось прокручивать страницу вниз до этого ответа! - person DarioP; 08.03.2019

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

#include<iostream>
#include <cstdlib>
using namespace std;
int main ()
{
int result = system("/usr/bin/python3 testGen1.py 1");
cout << result; 
}
person RiteshC    schedule 26.01.2019
comment
У меня работает при использовании встроенных модулей от python. Однако при импорте модуля (например, numpy) внутри файла python он не может быть импортирован. Есть идеи, как с этим справиться? - person Mauricio Arboleda; 18.02.2021

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

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

person David Dibben    schedule 08.09.2008

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

person Tony Meyer    schedule 08.09.2008
comment
Почему люди, использующие Windows, с большей вероятностью установят Python? - person Jacob Garby; 27.10.2017
comment
Ubuntu поставляется с установленным по умолчанию python 2, что вы имеете в виду? - person Remigiusz Schoida; 23.08.2018