Du bist nicht angemeldet.

Werbeanzeige

1

02.04.2019, 17:53

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

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:

(Link)


Ich habe ein eigens erstelltes Modul calc mit der Methode add zum Testen ebenfalls in diesen Ordner gepackt. Da klappt das Importieren des Moduls.

Quellcode

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


Hier mein Code für die gewollte API

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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;
}


Problem
Access violation read... . Was mache ich falsch?
Hier ist nebenbei die entsprechend Dokumentation dazu. Ich werde daraus nicht schlauer. https://pybind11.readthedocs.io/en/stabl…ibraries-from-c

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

Quellcode

1
2
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.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spixmaster« (02.04.2019, 18:38)


Nox

Supermoderator

Beiträge: 5 274

Beruf: Student

  • Private Nachricht senden

2

02.04.2019, 18:18

werte doch mal die exception bzw den python traceback aus.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

3

02.04.2019, 18:20

werte doch mal die exception bzw den python traceback aus.

Wie geht das? Noch nie gehört.

Nox

Supermoderator

Beiträge: 5 274

Beruf: Student

  • Private Nachricht senden

4

02.04.2019, 20:01

Moment stand da vorhin nicht was von error_already_set? Es ist schwierig ein bewegliches Ziel zu erwischen ;) .

Traceback kann man sich in python so anschauen: https://github.com/nmslib/nmslib/issues/327 (vgl dort gepostetes Beispiel).
Ansonsten schaut dir genau an was in der exception steht. Ansonsten kannst du noch versuchen den Aufruf Stück für Stück zu machen. Sprich

C-/C++-Quelltext

1
2
3
py::object pyObj1 = py::module::import("instagram_private_api");
py::object pyObj2 = pyObj1.attr("Client");
py::object pyObj3 = pyObj2.attr("ClientCompatPatch");
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

5

02.04.2019, 20:24

@Nox Du hast recht. habe es updaten müssen

Nox

Supermoderator

Beiträge: 5 274

Beruf: Student

  • Private Nachricht senden

6

02.04.2019, 22:34

Und sonst? Bist mittlerweile weiter gekommen? Hat das Anschauen der exception bzw des tracebacks oder das aufspiltten der Aufrufe irgendwas gebracht?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

7

03.04.2019, 16:18

@Nox. Mir fehlt nur noch der letzte Schritt. Das Ärgerliche an der Sache ist, dass ich darauf brenne, weiterzuprogrammieren, aber ich 100% von diesem Problem aufgehalten werde.
Wärst du so freundlich und könntest du dir diese Frage noch einmal anschauen?
Habe sie noch einmal sauber strukturiert hier gestellt: https://stackoverflow.com/questions/5549…f-a-python-repo

Vielen Dank für die Nachfrage im Übrigen!

Schorsch

Supermoderator

Beiträge: 5 188

Wohnort: Wickede

Beruf: Student

  • Private Nachricht senden

8

03.04.2019, 17:21

Ich weiß nicht ob deine Bibliothek für Python einfach die installierte Version von Python vom System verwendet. Falls dem so ist dann solltest du die API benutzen können, ohne die Dateien in dein Projektverzeichnis zu kopieren. Das kannst du ja einfach überprüfen indem du einfach mal versuchst die Funktionen daraus zu benutzen. Das bedeutet du importierst dir die passenden Module und arbeitest damit. Es ist aber nicht unwahrscheinlich dass die Bibliothek eine eigene Pythonimplementation benutzt, welche von deinen durch PIP installierten Modulen nichts weiß. Dann könntest du natürlich versuchen die Installierten Pythonmodule und deren Abhängigkeiten in dein Prohektverzeichnis zu kopieren. Am einfachsten ist es wenn du das einfach mal ausprobierst.

edit:

Zitat

It is also possible to import objects defined in the Python standard library or available in the current Python environment (sys.path) and work with these in C++.

Das klingt für mich als könntest du tatsächlich so als müsstest du das Modul nicht kopieren. Aber teste es am besten einfach.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Nox

Supermoderator

Beiträge: 5 274

Beruf: Student

  • Private Nachricht senden

9

04.04.2019, 01:28

Du stellst deine Frage unglaublich seltsam bzw wird für mich nicht wirklich klar wo nun eigentlich genau dein Problem liegt bzw woran es nun scheitert.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

10

04.04.2019, 08:05


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

Quellcode

1
2
import calc
calc.add()


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

"instagram_private_api" ist kein Modul sondern ein Package. Ein Package wird definiert durch einen Ordner mit einer __init__.py. In der __init__.py kann man Module importieren damit sie direkt aus dem Package verwendet werden können. Bei dem Package ist das so.

So wie ich pybind verstehe, versuchst du instagram_private_api.Client.ClientCompatPatch zu importieren. Es ist aber instagram_private_api.Client und instagram_private_api.ClientCompatPatch.

Ich würde es so versuchen:

C-/C++-Quelltext

1
2
3
py::object package = py::module::import("instagram_private_api")
py::object client = package.attr("Client")
py::object compat = package.attr("ClientCompatPatch")

Werbeanzeige