web-dev-qa-db-ja.com

Cython出力ファイルを指定する

デフォルトでは、cmdclassをbuild_extに設定してdistutils.coreからセットアップすると、現在の作業ディレクトリにあるcppまたはcファイルがコンパイルされるようです。生成されたcコードがどこに書き込まれているかを判断する方法はありますか?そうしないと、リポジトリに生成されたコードが散らばってしまいます。

たとえば、このファイルsetup.pyは、ファイルexample.cを現在の作業ディレクトリに書き込みます。

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

setup(
      ext_modules = cythonize("example.pyx"))
22
Michael WS

オプションbuild_dir="directory name"Cythonizeに渡すことができます

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

上記のコードは、生成されたcファイルをディレクトリ「build」に配置します(デフォルトでは、distutilsがビルド時に一時オブジェクトファイルなどを配置する場所であるため、これは理にかなっています)。


私の元の答えはbuild_dirではなくworkingでした。それはもはや正しくないようだと指摘してくれた@ArthurTaccaに感謝します。

15
DavidW

拡張機能を初期化した後、一時ディレクトリにcを作成するようにパラメータを設定できます。

 module  = Extension("temp", "temp.pyx")
 module.cython_c_in_temp = True 
12
Michael WS

Setup.pyは問題ありません。

別の場所にビルドするには、次の方法でpythonを呼び出します。

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

これを自動化するために、次のmakeルールを使用します。

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)
5