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





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?
Ubuntu поставляется с установленным python 2 по умолчанию, что вы имеете в виду?
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 в другое приложение. Затем обратитесь к следующим примерам
Если вам нравится Boost.Python, вы можете посетить следующие ссылки:
Это не работает ни с одной версией Visual Studio после 2008 года, поскольку это то, с чем скомпилирован python для Windows. Это возможно, если вы найдете или сможете сами скомпилировать версию python, используя более позднюю среду выполнения. Я только что потратил день, пытаясь скомпилировать python с использованием vs 2013, но безуспешно.
Мне удалось создать библиотеку для встраивания с помощью VS 2015. Это не так уж и сложно, но выяснение шагов было разочаровывающим. stackoverflow.com/questions/48545255/…
последняя ссылка не работает
Интересно, что еще никто не упомянул о 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
}
Вау, мне посчастливилось прокручивать вниз до этого ответа!
Используйте системный вызов для запуска скрипта 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 он не может быть импортирован. Есть идеи, как с этим справиться?
Возможный дубликат Вызов C / C++ из Python?