20

cythonとf2pyの両方に依存するいくつかのサブモジュールを含むPythonパッケージのsetup.pyスクリプトを作成したいと思います。setuptoolsとnumpy.distutilsを使用しようとしましたが、これまでのところ失敗しています。

setuptoolsの使用

setuptoolsを使用して、cython拡張機能をコンパイル(およびパッケージの残りの部分のインストールを作成)することができます。ただし、setuptoolsを使用してf2py拡張機能を生成する方法を理解できませんでした。徹底的に検索したところ、f2pyモジュールはnumpy.distutilsを使用してコンパイルする必要があるというこのようなかなり古いメッセージしか見つかりませんでした。

numpy.distutilsを使用する

numpy.distutilsを使用して、f2py拡張機能をコンパイル(およびパッケージの残りの部分のインストールを作成)することができます。ただし、最近は常にpyrexを使用してコンパイルしようとしているため(そしてcythonに固有の拡張機能を使用しているため)、numpy.distutilsでcython拡張機能をコンパイルする方法を理解できませんでした。私はcythonファイルのnumpy.distutilsを取得する方法を見つけるために検索を行いましたが、少なくとも1年前の時点で、 numpy.distutilsにモンキーパッチを適用することを推奨しています。このようなモンキーパッチを適用すると、Cythonに渡すことができるオプションも制限されるようです。

私の質問は、f2pyとcythonの両方に依存するパッケージのsetup.pyスクリプトを作成するための推奨される方法は何ですか?numpy.distutilsにパッチを適用することは、本当に静止する方法ですか?

4

2 に答える 2

6

http://answerpot.com/showthread.php?601643-cython%20and%20f2pyのように、setup.py でそれぞれを個別に呼び出すことができます。

# Cython extension
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
  ext_modules = [Extension( 'cext', ['cext.pyx'] )],
  cmdclass = {'build_ext': build_ext},
  script_args = ['build_ext', '--inplace'],
)

# Fortran extension
from numpy.distutils.core import setup, Extension
setup(
  ext_modules = [Extension( 'fext', ['fext.f90'] )],
)

現在のオブジェクト Extension と関数setup() が 何であるかに関して、呼び出しコンテキスト (彼らはこの名前空間を呼び出すと思いますが、確かではありません)
を変更する必要があります。

最初の setup() 呼び出し、それは distutils.extension.Extension
と distutils.core.setup() です

2 番目の setup() 呼び出しは、numpy.distutils.core.Extension
と numpy.distutils.core.setup() です。

于 2011-12-14T19:42:34.367 に答える
3

これはもはや真実ではないことがわかりました。setuptoolsdistutils(少なくともバージョン) の両方を使用numpyすると、C、Cython、および f2py で拡張機能を使用できます。唯一の注意点は、f2py モジュールをコンパイルするには、常にと関数numpy.distutilsの両方を使用する必要があるということです。ただし、インストールには引き続き使用できます (たとえば、 を使用して開発者バージョンのインストールを許可します)。setupExtensionsetuptoolspython setup.py develop

排他的に使用distutilsするには、次を使用します。

from numpy.distutils.core import setup
from numpy.distutils.extension import Extension

を使用するsetuptoolsには、インポートの前にインポートする必要がありますdistutils

import setuptools

そして、コードの残りの部分は同じです:

from numpy import get_include
from Cython.Build import cythonize

NAME = 'my_package'
NUMPY_INC = get_include()
extensions = [
    Extension(name=NAME + ".my_cython_ext", 
              include_dirs=[NUMPY_INC, "my_c_dir"]
              sources=["my_cython_ext.pyx", "my_c_dir/my_ext_c_file.c"]),
    Extension(name=NAME + ".my_f2py_ext", 
              sources=["my_f2py_ext.f"]),
]
extensions = cythonize(extensions)
setup(..., ext_modules=extensions)

setup()明らかに、他のすべてのものを通話に入れる必要があります。上記では、Cython で numpy を にある外部 C ファイル ( my_ext_c_file.c)とともに使用my_c_dir/し、f2pyモジュールが 1 つの Fortran ファイルのみであると想定しています。必要に応じて調整します。

于 2017-01-27T14:21:55.533 に答える