Где поместить .py в проект C ++, чтобы у меня был доступ к нему с помощью pybind11? - PullRequest
1 голос
/ 02 апреля 2019

Case

Я создал проект C ++ под названием «EmbedPython» в Visual Studio. В результате я хочу встроить Python API в C ++ с pybind11.

Мой проект Visual Studio

В целях тестирования я создал собственный модуль calc с методом , добавив и поместив его в ту же папку. С calc.py работает импорт.

py::object calc = py::module::import("calc");

Мой код для разыскиваемого API

#include <pybind11/embed.h> // everything needed for embedding
#include <iostream>
#include <exception>

namespace py = pybind11;

int main()
{
    py::scoped_interpreter guard{}; // start the interpreter and keep it alive

    try
    {
        py::object pyObj = py::module::import("instagram_private_api").attr("Client").attr("ClientCompatPatch");
    }
    catch (std::exception &e)
    {
        std::cout << e.what() << std::endl;
    }


    int i;
    std::cin >> i;
}

Проблема

Доступ к нарушению чтения ... происходит. Что я делаю не так?

Вот документация pybind11, которая должна помочь: https://pybind11.readthedocs.io/en/...object.html#accessing-python-libraries-from-c

Код ошибки

['F:\\Programmieren\\C++\\meine C++ - Projekte\\EmbedPython\\x64\\Release\\python36.zip', 'F:\\Programmieren\\C++\\meine C++ - Projekte\\EmbedPython\\EmbedPython\\DLLs', 'F:\\Programmieren\\C++\\meine C++ - Projekte\\EmbedPython\\EmbedPython\\lib', 'F:\\Programmieren\\C++\\meine C++ - Projekte\\EmbedPython\\x64\\Release', '.']
AssertionError: SRE module mismatch

At:
  F:\Programmieren\C++\meine C++ - Projekte\EmbedPython\EmbedPython\lib\sre_compile.py(17): <module>
  <frozen importlib._bootstrap>(219): _call_with_frames_removed
  <frozen importlib._bootstrap_external>(678): exec_module
  <frozen importlib._bootstrap>(665): _load_unlocked
  <frozen importlib._bootstrap>(955): _find_and_load_unlocked
  <frozen importlib._bootstrap>(971): _find_and_load
  F:\Programmieren\C++\meine C++ - Projekte\EmbedPython\EmbedPython\lib\re.py(123): <module>
  <frozen importlib._bootstrap>(219): _call_with_frames_removed
  <frozen importlib._bootstrap_external>(678): exec_module
  <frozen importlib._bootstrap>(665): _load_unlocked
  <frozen importlib._bootstrap>(955): _find_and_load_unlocked
  <frozen importlib._bootstrap>(971): _find_and_load
  F:\Programmieren\C++\meine C++ - Projekte\EmbedPython\EmbedPython\lib\tokenize.py(33): <module>
  <frozen importlib._bootstrap>(219): _call_with_frames_removed
  <frozen importlib._bootstrap_external>(678): exec_module
  <frozen importlib._bootstrap>(665): _load_unlocked
  <frozen importlib._bootstrap>(955): _find_and_load_unlocked
  <frozen importlib._bootstrap>(971): _find_and_load
  F:\Programmieren\C++\meine C++ - Projekte\EmbedPython\EmbedPython\lib\linecache.py(11): <module>
  <frozen importlib._bootstrap>(219): _call_with_frames_removed
  <frozen importlib._bootstrap_external>(678): exec_module
  <frozen importlib._bootstrap>(665): _load_unlocked
  <frozen importlib._bootstrap>(955): _find_and_load_unlocked
  <frozen importlib._bootstrap>(971): _find_and_load
  F:\Programmieren\C++\meine C++ - Projekte\EmbedPython\EmbedPython\lib\traceback.py(5): <module>
  <frozen importlib._bootstrap>(219): _call_with_frames_removed
  <frozen importlib._bootstrap_external>(678): exec_module
  <frozen importlib._bootstrap>(665): _load_unlocked
  <frozen importlib._bootstrap>(955): _find_and_load_unlocked
  <frozen importlib._bootstrap>(971): _find_and_load
  F:\Programmieren\C++\meine C++ - Projekte\EmbedPython\EmbedPython\lib\logging\__init__.py(26): <module>
  <frozen importlib._bootstrap>(219): _call_with_frames_removed
  <frozen importlib._bootstrap_external>(678): exec_module
  <frozen importlib._bootstrap>(665): _load_unlocked
  <frozen importlib._bootstrap>(955): _find_and_load_unlocked
  <frozen importlib._bootstrap>(971): _find_and_load
  F:\Programmieren\C++\meine C++ - Projekte\EmbedPython\x64\Release\instagram_private_api\client.py(8): <module>
  <frozen importlib._bootstrap>(219): _call_with_frames_removed
  <frozen importlib._bootstrap_external>(678): exec_module
  <frozen importlib._bootstrap>(665): _load_unlocked
  <frozen importlib._bootstrap>(955): _find_and_load_unlocked
  <frozen importlib._bootstrap>(971): _find_and_load
  F:\Programmieren\C++\meine C++ - Projekte\EmbedPython\x64\Release\instagram_private_api\__init__.py(3): <module>
  <frozen importlib._bootstrap>(219): _call_with_frames_removed
  <frozen importlib._bootstrap_external>(678): exec_module
  <frozen importlib._bootstrap>(665): _load_unlocked
  <frozen importlib._bootstrap>(955): _find_and_load_unlocked
  <frozen importlib._bootstrap>(971): _find_and_load

Дополнительный

Насколько я понимаю из Python, модуль - это просто .py со своим содержимым, похожим на класс. Поэтому вызывается модуль calc с методом add. Это правильно?

import calc
calc.add()

Тогда где же находится instagram_private_api.py в API Python?

О себе

Главным образом, я разрабатываю с C ++. Я делаю Python в течение нескольких дней и только потому, что мне нужен API выше.

...