3

modA合成されたサブモジュールmodB(で作成) を含むmoduleがありますPyModule_New。モジュールをインポートしています:

  1. from modA import modB大丈夫です
  2. import modA.modB失敗します。

私は何が欠けていますか?

  • modA.cpp (を使用しboost::pythonますが、Python の純粋な c-API と同じである可能性が非常に高いです):

    #include<boost/python.hpp>
    namespace py=boost::python;
    
    BOOST_PYTHON_MODULE(modA){
       py::object modB=py::object(py::handle<>(PyModule_New("modB")));
       modB.attr("__file__")="<synthetic>";
       py::scope().attr("modB")=modB;
    };
    
  • でコンパイルします (clang++ の代わりに g++ は同じように動作します)

    clang++ -o modA.so modA.cpp -fPIC -shared  -lboost_python `pkg-config python --cflags --libs`
    
  • test.py:

    import sys
    sys.path.append('.')
    from modA import modB
    import modA.modB
    
  • python test.py(最初のインポートは問題なく、失敗するのは 2 番目のインポートであることに注意してください):

    Traceback (most recent call last):
      File "test.py", line 4, in <module>
        import modA.modB
    ImportError: No module named modB
    
4

3 に答える 3

1

これが私が使用するパターンです。うまくいけば、以前の回答が改善されることを願っています...

module.h:

...
#define STR(str) #str
#define MAKE_SUBMODULE(mod, submod) object submod##_module(handle<>(borrowed(PyImport_AddModule(STR(mod.submod)))));\
scope().attr(STR(submod)) = submod##_module;\
scope submod##_scope = submod##_module;\
...
export_submodule();
...

モジュール.cpp:

BOOST_PYTHON_MODULE(modulename)
{
    export_submodule();
}

サブモジュール.cpp:

export_submodule()
{
    // create submodule
    MAKE_SUBMODULE(modulename, submodulename)

    // all code below is now in submodule's scope
    ...
}

「生成された」コードは次のようになります。

object submodulename_module(handle<>(borrowed(PyImport_AddModule("modulename.submodulename"))));
scope().attr("submodulename") = submodulename_module;
scope submodulename_scope = submodulename_module;

eudoxos の回答に似ていますが、違いは詳細にあるPyImportNew()ようPyImportAdd()です。from module.submodule import *したがって、ステートメントを機能させるために最後の行は必要ありません。

于 2015-01-24T23:27:51.563 に答える
1

この回答のおかげsys.modules['modA.modB']=modBで、モジュール初期化関数で c++ で書かれているが、で構成されているソリューションを見つけました。

#include<boost/python.hpp>
namespace py=boost::python;

BOOST_PYTHON_MODULE(modA){
   py::object modB=py::object(py::handle<>(PyModule_New("modA.modB")));
   modB.attr("__file__")="<synthetic>";
   py::scope().attr("modB")=modB;

   // this was the missing piece: sys.modules['modA.modB']=modB
   py::extract<py::dict>(py::getattr(py::import("sys"),"modules"))()["modA.modB"]=modB;
};
于 2012-06-16T12:36:49.637 に答える
0

modBはファイル (つまりモジュール) ではなく、 内のオブジェクトでmodAあるため、インポートできません。

Python のモジュール docsを見たいと思うかもしれません。

于 2012-06-16T12:25:35.960 に答える