2017-08-09 4 views
0

Wie erstellt man Python-Submodule mit pybind11?Hinzufügen von C++ - Funktion zum vorhandenen Python-Modul mit pybind11

Ich Klon das Python-Beispiel (https://github.com/pybind/python_example) und änderte es. Unten ist der Verzeichnisbaum.

* 
| 
+-- src 
| | 
| +-- example.cpp 
| 
+-- setup.py 
| 
+-- python_example 
    | 
    +-- __init__.py 
    | 
    +-- cxx 
     | 
     +-- __init__.py 

setup.py hat die folgenden Zeilen:

ext_modules = [ 
    Extension(
     'python_example.cxx', 
     ['src/main.cpp'], 
     include_dirs=[ 
      # Path to pybind11 headers 
      get_pybind_include(), 
      get_pybind_include(user=True), 
      "include", # the include folder 
     ], 
     language='c++' 
    ), 
] 



setup(
    ... 
    packages=setuptools.find_packages(), 
    ... 
) 

Die folgende funktioniert nicht, weil es keine Namen mit Punkt nehmen.

PYBIND11_PLUGIN(python_example.cxx) { 
    ... 
} 

Das Folgende funktioniert auch nicht.

PYBIND11_PLUGIN(python_example) { 
    py::module m = py::module::import("python_example.cxx"); 

    m.def("add", &add, R"pbdoc(
     Add two numbers 

     Some other explanation about the add function. 
    )pbdoc"); 
} 

Das funktioniert auch nicht:

py::module m2 = (py::module) py::module::import("python_example").attr("cxx"); 

m2.def("add", &add, R"pbdoc(... 

Wie diese Arbeit machen?

+0

Hoffnung besteht ... Das scheint verwandt zu sein: http://pybind11.readthedocs.io/en/stable/advanced/misc. html # partitioning-code-over-multiple-extension-modules –

+0

Ich denke, die Lösungen sind anders;) Könnten Sie versuchen, das Beispiel zu minimieren (wie ein Modul kein Paket verwenden) und vollständiger (geben Sie an, was das erste Modul ist , was ist der zweite, fügen Sie Beispielcode vorzugsweise hinzu)? – krassowski

+0

Ich habe bereits die Lösung gefunden. –

Antwort

1

cxx ist ein Unterpaket und Sie versuchen, ein Binärmodul mit dem gleichen Namen zu erstellen. Versuchen Sie, Ihr Binärmodul anders zu benennen, um Namenskonflikte zu vermeiden.

setup.py:

ext_modules = [ 
    Extension(
     'python_example.cxx.cxx_module', 
... 

main.cpp:

PYBIND11_PLUGIN(cxx_module) { 
    ... 
} 
Verwandte Themen