общаться между python и C ++

Я хочу создать модуль python, который может вызывать функции из класса C ++ и вызывать функции c ++ из этого класса

я смотрел на повышение, однако, похоже, что это не имеет никакого смысла, это относится к общей библиотеке (которую я не знаю, как ее создать), и я не могу использовать код, который они используют в примерах (кажется, очень запутанным)

вот их приветственный мировой учебник ( http://www.boost.org/doc/libs/1_55_0b1/libs/python/doc/tutorial/doc/html/index.html#python.quickstart )

Следуя традиции C / C ++, давайте начнем с «привет, мир». Функция C ++:

char const* greet() { return "hello, world"; } 

может быть выставлен Python, написав оболочку Boost.Python:

 include <boost/python.hpp> BOOST_PYTHON_MODULE(hello_ext) { using namespace boost::python; def("greet", greet); } 

Вот и все. Были сделаны. Теперь мы можем создать это как общую библиотеку. Результирующая DLL теперь видна Python. Вот пример сессии Python:

 >>> import hello_ext >>> print hello_ext.greet() hello, world 

Следующая остановка … Создание вашего модуля Hello World от начала до конца …

кто-то может помочь объяснить, что делается, и, прежде всего, о том, как python знает о файле C ++

2 Solutions collect form web for “общаться между python и C ++”

Python не знает о файле C ++, он будет знать только модуль расширения, который скомпилирован из файла C ++. Этот модуль расширения является объектным файлом, называемым общей библиотекой. Этот файл имеет интерфейс, который выглядит на Python, как если бы он был обычным модулем Python .

Этот объектный файл будет существовать только после того, как вы скажете компилятору скомпилировать файл C ++ и связать его со всеми библиотеками, в которых он нуждается. Конечно, первой библиотеке необходимо самому Boost.Python, которое должно быть доступно в системе, в которой вы компилируете.

Вы можете сказать Python для компиляции файла C ++ для вас, так что вам не нужно связываться с компилятором и его флажками библиотеки. Для этого вам понадобится файл setup.py котором вы используете библиотеку Setuptools или стандартный Distutils, чтобы определить, как ваши другие модули Python должны быть установлены в системе. Одним из шагов для установки является компиляция всех модулей расширения, называемых фазой build_ext .

Представим себе, что у вас есть следующие каталоги и файлы:

 hello-world/ ├── hello_ext.cpp └── setup.py 

Содержимое setup.py :

 from distutils.core import setup from distutils.extension import Extension hello_ext = Extension( 'hello_ext', sources=['hello_ext.cpp'], include_dirs=['/opt/local/include'], libraries=['boost_python-mt'], library_dirs=['/opt/local/lib']) setup( name='hello-world', version='0.1', ext_modules=[hello_ext]) 

Как вы можете видеть, мы говорим Python, что есть расширение, которое мы хотим скомпилировать, где находится исходный файл, и где должны быть найдены библиотеки. Это зависит от системы . Пример, показанный здесь, относится к системе Mac OS X, где библиотеки Boost были установлены через MacPorts.

Содержимое hello_ext.cpp показано в учебнике, но BOOST_PYTHON_MODULE осторожны, чтобы изменить порядок вещей, чтобы макрос BOOST_PYTHON_MODULE после определений того, что должно быть экспортировано в Python :

 #include <boost/python.hpp> char const* greet() { return "hello, world"; } BOOST_PYTHON_MODULE(hello_ext) { using namespace boost::python; def("greet", greet); } 

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

 $ python setup.py build_ext --inplace running build_ext building 'hello_ext' extension /usr/bin/clang -fno-strict-aliasing -fno-common -dynamic -pipe -Os -fwrapv -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/opt/local/include -I/opt/local/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c hello_ext.cpp -o build/temp.macosx-10.9-x86_64-2.7/hello_ext.o /usr/bin/clang++ -bundle -undefined dynamic_lookup -L/opt/local/lib -Wl,-headerpad_max_install_names -L/opt/local/lib/db46 build/temp.macosx-10.9-x86_64-2.7/hello_ext.o -L/opt/local/lib -lboost_python-mt -o ./hello_ext.so 

(Флаг --inplace указывает Python оставить продукты компиляции прямо рядом с исходными файлами. По умолчанию это переместить их в каталог build , чтобы сохранить исходный каталог в чистоте.)

После этого вы найдете новый файл hello_ext.dll (или hello_ext.so в Unix) в каталоге hello-world . Если вы запустите интерпретатор Python в этом каталоге, вы сможете импортировать модуль hello_ext и использовать функцию greet , как показано в учебнике Boost.

Python – интерпретируемый язык. Это означает, что для выполнения операторов требуется виртуальная машина. Например, если он встречает a = 5 , python (или, скорее, виртуальная машина, которая интерпретирует ваш код на Python), создаст объект в памяти, который содержит некоторую информацию и значение 5, и будет убедиться, что любая последующая ссылка на a найдет объект. То же самое касается более сложных операторов, таких как input , в этих командах виртуальная машина запускает жестко закодированную процедуру, которая будет выполнять большую работу под капотом, прежде чем вернуться назад, чтобы прочитать следующий фрагмент кода python. Все идет нормально.

О модулях. При выдаче инструкции import python будет искать указанное имя модуля в свой путь. Обычно это файл .py содержащий только чистый код python для интерпретации. Но это также может быть файл .pyd , содержащий скомпилированные подпрограммы, которые python может использовать, как исполняемый файл, с общей библиотекой . Этот файл содержит символы и точки входа, так что когда интерпретатор находит специальное имя метода, например mymodule.mymethod() он знает, где найти подпрограмму для ее выполнения и запускает ее.

Однако эти подпрограммы должны соответствовать конкретному интерфейсу, и поэтому прямо не нужно открывать функции C / C ++ для python. Наиболее очевидной проблемой является то, что python int не является C int , а не short , даже не long . Это специальная структура, которая содержит намного больше информации, например, как часто ссылается на переменную (чтобы освободить память для переменных, на которые больше не ссылаются), тип значения, которое он имеет, и т. Д. Конечно, типичный C / Библиотека C ++ не работает с этими сложными типами, но использует vanilla int , float , char* и другие приятные простые типы. Поэтому нужно перевести необходимые значения python в простые типы C, которые могут быть поняты библиотекой, и преобразовать потенциальные результаты, полученные библиотекой, в формат, используемый на виртуальной машине python. Это то, что называется оберткой . Обертка также должна заботиться о смешных вещах, таких как подсчет ссылок, управление памятью в куче, инициализация и финализация, а также другие обезьяны. См. Некоторые примеры, чтобы понять, как выглядит такой код. Это не очень сложно, но все же некоторая работа.

Теперь вы получаете представление о всей тяжелой работе, выполняемой под капотом библиотекой Python.Boost (или другими инструментами обертывания для этого) при вызове смехотворно простого def("greet", greet); ,

  • Почему матричное умножение происходит быстрее с numpy, чем с ctypes в Python?
  • error: значение типа 'PyObject' (aka '_object') не конвертируется контекстом в 'bool'
  • Как я могу анализировать макросы в коде C ++, используя CLANG в качестве синтаксического анализатора и Python в качестве языка сценариев?
  • Я хочу подождать как файлового дескриптора, так и мьютекса, какой рекомендуемый способ сделать это?
  • Вычислить / проверить bz2 (bzip2) CRC32 в Python
  • Есть ли эквивалент диапазона Pythons (12) в C #?
  • OpenCV Python связывает невероятно медленные итерации с помощью данных изображения
  • TNonblockingServer в аварийных ситуациях, когда открывается TFramedTransport
  • Преобразование SHA Hash Computation в Python в C #
  • Схема проектирования, используемая в проектах
  • Вывод из моего обнаружения C ++ OpenCV Hough Circle Detection и из моего обнаружения Python OpenCV Hough Circle Detection отличается
  • Python - лучший язык программирования в мире.