2017-08-30 17 views
0

私が理解している限り、メモリ共有のために、ベクトル[T]を返すC++関数をPythonで公開することはできません限界。 したがって、インポートされた関数を使用し、Python拡張モジュールに適切に公開する2番目の関数を作成する必要があります。同じ名前で直接公開することができないC++関数を公開する方法

問題:私は同じ関数名を使用できません。拡張モジュールには多くの関数名が付いています。例えば。 、以下のC++関数のインポートを参照してください、そして公開:

cdef extern from "somestuffs.h" namespace "stf": 
    cdef vector[float] stufffn(int n) 

cpdef np.ndarray[np.float64_t, ndim=1] pystufffn(int n): 
    return np.asarray(stufffn(n)) 

addhoc機能なしstufffn直接機能を公開する方法はありますか? 拡張子に "stufffn"という名前を保存して "pystufffn"を避ける方法はありますか?

私は既存のライブラリのラッパーを構築しているので、私は現状のコードの名前を変更できないことに注意してください。

お返事ありがとうございます。

+0

[はい、あなたがC++関数からのpythonにベクトルを返すことができpython.AndにC++のクラスや関数を公開するためにブーストのpythonを使用することができます。あなただけがベクトル型をPythonモジュールに公開する必要があります。 – sagar

+0

私は今、ブーストのpythonを発見している、素晴らしいです。 最後の2つの文のポインタ/参照/例はありますか? – GDegottex

+0

pybind11も参照してください。本質的にBoost.Pythonの最新バージョン(C++ 11を活用しています)https://pybind11.readthedocs.io/en/stable/intro.html – chrisb

答えて

0

下記のdoc-linkの1つのアプローチでは、pxdファイルのextern関数を宣言し、その名前空間を使用して実装で名前を再利用することができます。

# wrappers.pxd 
cdef extern from "somestuffs.h" namespace "stf": 
    cdef vector[float] stufffn(int n) 

# mymodule.pyx 
cimport wrappers 
cpdef np.ndarray[np.float64_t, ndim=1] stufffn(int n): 
    return np.asarray(wrappers.stufffn(n)) 

http://cython.readthedocs.io/en/latest/src/userguide/sharing_declarations.html#using-cimport-to-resolve-naming-conflicts

+0

素晴らしい!ちょうどそれを解決する! – GDegottex

関連する問題