2017-08-09 8 views
0

pybind11でpythonサブモジュールを作成するには?pybind11で既存のpythonモジュールにC++関数を追加

私はPythonの例(https://github.com/pybind/python_example)をクローンして修正しました。以下はディレクトリツリーです。

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

setup.pyは次の行があります

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(), 
    ... 
) 

それはドットで名前を取ることができないので、以下は動作しません。

PYBIND11_PLUGIN(python_example.cxx) { 
    ... 
} 

次のコードも機能しません。

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"); 
} 

また、これは動作しません:

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

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

この作業を行うには?

+0

ホープ存在する...これが関係しているように見える:http://pybind11.readthedocs.io/en/stable/advanced/misc。 html#partitioning-code-over-multiple-extension-modules –

+0

解決策は異なると思います;)モジュールをパッケージ以外のものにするなど、 、2番目は何ですか;サンプルコードを追加することをお勧めします)? – krassowski

+0

私はすでに解決策を見つけました。 –

答えて

1

cxxはサブパッケージであり、同じ名前のバイナリモジュールを作成しようとしています。名前の衝突を避けるために、バイナリモジュールの名前を変更するようにしてください。

setup.py

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

main.cpp

PYBIND11_PLUGIN(cxx_module) { 
    ... 
} 
関連する問題