デフォルトでは、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"))
オプション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に感謝します。
拡張機能を初期化した後、一時ディレクトリにcを作成するようにパラメータを設定できます。
module = Extension("temp", "temp.pyx")
module.cython_c_in_temp = True
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)