Wo .py in C++ Projekt hin, damit ich mit pybind Zugriff darauf habe?

Spixmaster528

Cadet 1st Year
Registriert
März 2019
Beiträge
13
Szenario
Ich habe ein C++ Projekt names "EmbedPython" erstellt mit Visual Studio. Im Allgemeinen möchte ich eine Python-API in das Programm einbetten mit pybind11.

Mein angelegtes Projekt
Das ist die API: https://github.com/ping/instagram_private_api
Dort habe ich die Python-API (instagram_private_api, instagram_web_api) hingepackt:

Anhang anzeigen 3833

Ich habe ein eigens erstelltes Modul calc mit der Methode add zum Testen ebenfalls in diesen Ordner gepackt. Da klappt das Importieren des Moduls.
Code:
py::object calc = py::module::import("calc");

Hier mein Code für die gewollte API
Code:
#include <pybind11/embed.h> // everything needed for embedding
#include <iostream>
namespace py = pybind11;

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

    py::object pyObj = py::module::import("instagram_private_api").attr("Client").attr("ClientCompatPatch");

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

Problem
error_already_set wird geworfen. Was mache ich falsch?
Hier ist nebenbei die entsprechend Dokumentation dazu. Ich werde daraus nicht schlauer.

Zusätzlich
Mein kurzes Verständnis zu Python. Ein Modul ist doch einfach eine .py samt ihren Inhaltes, die wie eine Klasse zu verstehen ist. Also Modul calc mit Methode add ruft man in einem anderen Modul mit
Code:
import calc
calc.add()

Wo ist denn bitte dann instagram_private_api.py in der Python API?!

Über mich
Ich programmiere hauptsächlich in C++. Python mache ich erst seit ein paar Tagen und nur weil ich die oben genannte API brauche.
 
Also ich habe nicht wirklich Ahnung von Python oder pybind, aber ich verstehe das mit den Modulen erstmal so wie du: Du hast ein Modul calc und entsprechend deine calc.py, die du erfolgreich einbinden kannst.

In welchem Verzeichnis liegt denn diese calc.py, dort wo du die Instagram-Api installiert hast?

Sehe ich mir jetzt diese Instagram-Api an, dann ist das für mich eine Sammlung verschiedener Module, aber kein Modul an sich.

Müsste man das Modul dann nicht eher so importieren:

Code:
  py::object client = py::module::import("instagram_private_api/client");
 
@Revan1710 Hier ist calc.py

769535
 
Ich hab mir die Api mal auf meiner Ubuntu VM installiert und in normalem python (also ohne pybind) kannst du es so importieren:

Code:
from instagram_private_api import client

// oder

import instagram_private_api.client

Die Frage ist nun wie pybind solche Module eines Pakets imporiert, am naheliegensten wohl einfach mit einem Punkt:

Code:
py::object client = py::module::import("instagram_private_api.Client");
py::object compatPatch = py::module::import("instagram_private_api.ClientCompatPatch");

Edit:

Bei den oben genannten Importierungen gibt es noch einen Unterschied für das Erzeugen einer Objekt-Instanz der Klasse Client (nicht das Modul client). Die sehen dann nämlich so aus:

Code:
// Variante 1
c = Client('user', 'password')

// Variante 2
c = instagram_private_api.client.Client('user', 'password')

Also würdest du vmtl. auch eher die zweite Variante benötigen, denn du versuchst ja vmtl. ein Objekt Client zu erzeugen und nicht nur das Modul client zu importieren
 
Zuletzt bearbeitet:
Zurück
Oben