2016-05-17 4 views
0

numpy関数random/randomkit.hへの直接アクセスを得ようとしていますが、マルチスレッドアプリケーションでcythonを使って(つまりgilを使わずに)ランダムジェネレータを使用します。私は次のコードを使用してnumpyののフォルダからヘッダファイルにアクセスしようとしていますそのためにCython:ダイナミック "xxxからのcdef extern"

:cythonはstr_randomkit_h文字列を訴えしかし、これはpyximportでは動作しません

import os 
import numpy 

str_rkdir = os.path.dirname(os.path.abspath(numpy.__file__)) 
str_randomkit_h = str_rkdir + "/random/randomkit.h" 

cdef extern from str_randomkit_h: 
    ctypedef struct rk_state 
    cdef unsigned long rk_random(rk_state * state) nogil 
    cdef signed long rk_gauss(rk_state * state) nogil 
    cdef void rk_seed(unsigned long seed, rk_state * state) nogil 

を(私はそれがdoesnの推測コンパイルする前にPythonコードを解釈しないでください)...これは単純な方法ですか?

汚れた回避策として、私は.pxdをcythonコンパイルの前に動的に生成していますが、これは本当にうまく感じられないので、より良い方法があるかどうか疑問に思っていました。

+1

このタイプのものは、通常、ビルドスクリプトによって処理されます。あなたは "setup.py"ビルドパスに正しいディレクトリを追加することができますか? –

+0

元気ですね。私は便宜のためにpyximportを使っていますが、絶対パスが必要だと思いますが、もう一度チェックします。 – Silmathoron

答えて

1

動的には、あなたが言っているように、進行中の解釈はないので、コンパイルするだけで、そのように動作させることはできません。 DEFは、前処理段階で使用できる機能が制限されているために役立たず、私はこれを行うための他の卑劣な方法があるとは思わない。 pyximportまたはsetup.pyスクリプトを使用する必要があります。

pyximportを使用すると、install関数に適切な引数を指定できます。インクルードファイル(複数可)を含むディレクトリ/ IESがキー'include_dirs'setup_args辞書に値として与えることができます。もちろん

>>> from numpy import random as rnd  
>>> from pyximport import install 
>>> install(setup_args={'include_dirs':rnd.__path__[0] + '/'}) 

、やってこれはあなたにも、ヘッダー名を提供するために、あなたの.pxdファイルを変更した意味します

cdef extern from "randomkit.h": 
    ... 

また、using a setup scriptは非常にわかりやすい文字列リテラルです。ここでもまた、ある形でそれらを計算した後にinclude_dirsを供給するだけです。

+1

ok、これは良い説明です。 – Silmathoron