2015-12-17 24 views
12

distutils.coreのcmdclassをbuild_extに設定すると、現在の作業ディレクトリのcppまたはcファイルがコンパイルされるようです。生成されたCコードがどこに書き込まれるかを判断する方法はありますか?それ以外の場合は、生成されたコードでリポジトリが分割されます。このファイルsetup.pyは、現在の作業ディレクトリにファイルはexample.cを書きます。例えばcython出力ファイルを指定する

from distutils.core import setup 
from Cython.Build import cythonize 

setup(
     ext_modules = cythonize("example.pyx")) 

答えて

7

あなたはbuild_dir="directory name"

Cythonizeから
# rest of file as before 
setup(
     ext_modules = cythonize("example.pyx", 
           build_dir="build")) 

に上記のコードをオプションを渡すことができます生成されたcファイルを "build"ディレクトリに置きます(デフォルトでは、distutilsがビルド時に一時的なオブジェクトファイルを置く場所なので、意味があります)。


私のオリジナルの答えはworking、ないbuild_dirを持っていました。それがもはや正しいとは思わないことを指摘してくれた@ArthurTaccaに感謝します。

+1

正しいオプションがあると思われます"build_dir"は "働いていません"。おそらくそれはCythonの最近のバージョンで変更されました。他のビルドファイルとの衝突を避けるために、おそらく単に "ビルド"を使用するのは最善の方法です。 "build/cython"のようなサブディレクトリが良いでしょう。 –

+0

一見して、あなたは正しいと思う - ありがとう。 githubのコードを見ると、2015年以降どこが変わったのかわからないので、どこから得たのか分かっている人がいる(しかし、当時はそうなっていたはずだと思います...)。私はそれが動作することを確認した後、私はそれを更新します。 – DavidW

3

エクステンションを初期化した後、一時ディレクトリにcを作成するようにパラメータを設定できます。

module = Extension("temp", "temp.pyx") 
module.cython_c_in_temp = True 
+0

これは私の答えよりも少し良い解決策だと思います。 – DavidW

1

あなたのsetup.pyは問題ありません。それは次のようにのpythonを起動し、別の場所に構築するために取得するには

python setup.py build_ext --build-lib <build directory> 

私は以下を使用し、これを自動化するルールを作る:

python_lib_dir=src/lib 

cython_output = $(patsubst $(python_lib_dir)/%.pyx,$(python_lib_dir)/%.so, $(shell find $(python_lib_dir) -name '*.pyx')) 

$(cython_output):%.so:%.pyx  
    python setup.py build_ext --build-lib $(python_lib_dir) 
関連する問題