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

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

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

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

Возможный дубликат Вызов C / C++ из Python?

Trevor Boyd Smith 25.04.2019 14:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
56
1
86 390
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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

Boost.Python

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

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

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

Почему люди, использующие Windows, с большей вероятностью установят Python?

Jacob Garby 27.10.2017 21:51

Ubuntu поставляется с установленным python 2 по умолчанию, что вы имеете в виду?

Remigiusz Schoida 23.08.2018 19:45

I would like to call python script files from my c++ program.

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

Embedding Python is similar to extending it, but not quite. The difference is that when you extend Python, the main program of the application is still the Python interpreter, while if you embed Python, the main program may have nothing to do with Python — instead, some parts of the application occasionally call the Python interpreter to run some Python code.

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

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

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

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

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

  1. Встраивание Python с Boost.Python, часть 1

Это не работает ни с одной версией Visual Studio после 2008 года, поскольку это то, с чем скомпилирован python для Windows. Это возможно, если вы найдете или сможете сами скомпилировать версию python, используя более позднюю среду выполнения. Я только что потратил день, пытаясь скомпилировать python с использованием vs 2013, но безуспешно.

David 29.04.2014 20:01

Мне удалось создать библиотеку для встраивания с помощью VS 2015. Это не так уж и сложно, но выяснение шагов было разочаровывающим. stackoverflow.com/questions/48545255/…

Jiminion 26.04.2018 17:28
«Это означает, что вы хотите встроить Python в свое приложение C++ ...» - not necessarily. He may well want to start an external process and wait for the process.
jww 01.04.2019 23:56

последняя ссылка не работает

joel 30.11.2019 20:19

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

pybind11 is a lightweight header-only library that exposes C++ types in Python and vice versa, mainly to create Python bindings of existing C++ code. Its goals and syntax are similar to the excellent Boost.Python library by David Abrahams: to minimize boilerplate code in traditional extension modules by inferring type information using compile-time introspection. [...] Since its creation, this library has grown beyond Boost.Python in many ways, leading to dramatically simpler binding code in many common situations.

Конкретно, вызвать функцию 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
}

Вау, мне посчастливилось прокручивать вниз до этого ответа!

DarioP 08.03.2019 20:09

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

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

У меня работает при использовании встроенных модулей от python. Однако при импорте модуля (например, numpy) внутри файла python он не может быть импортирован. Есть идеи, как с этим справиться?

Mauricio Arboleda 18.02.2021 11:01

Другие вопросы по теме