6

私は、プログラムが実行されるたびに対話型コマンドプロンプトを介して大量のユーザー入力を必要とするプログラムブロックを介して実行されるいくつかのサブルーチンを実装するFortran77コードを継承しました。コードの実行を自動化したいので、すべてのサブルーチンをモジュールに移動し、F2PYを介してラッパーコードを記述しました。2ステップのコンパイル後、すべてが正常に機能します。

gfortran -c my_module.f90 -o my_module.o -ffixed-form
f2py -c my_module.o -m my_wrapper my_wrapper.f90

これにより、最終的に、、、、およびの3つのファイルが作成さmy_module.oれます。これは、レガシーFortranコードにアクセスするためにPythonにインポートするモジュールです。my_wrapper.omy_module.modmy_wrapper.somy_wrapper.so

私の目標は、このコードを科学コードのより大きなパッケージに含めることです。このパッケージには、Cythonモジュールの構築にすでにsetup.py使用されています。distutils今のところCythonコードを完全に無視していますが、2ステップのビルドを拡張機能に変換するにはどうすればよいですsetup.pyか?私が理解できた終値は次のようになります。

from numpy.distutils.core import setup, Extension
wrapper = Extension('my_wrapper', ['my_wrapper.f90', ])
setup(
    libraries = [('my_module', dict(sources=['my_module.f90']],
                                    extra_f90_compile_args=["-ffixed-form", ])))],
    ext_modules = [wrapper, ]
)

ただし、これは機能しません。私のコンパイラはに多くの警告をスローしますmy_module.f90が、それでもコンパイルされます(上記のコンパイラ呼び出しを使用しても警告はスローされません)。ただし、ラッパーをコンパイルしようとすると、my_module.mod正常に作成されていても、は見つかりません。

何かご意見は?些細なことを見逃しているような気がしますが、ドキュメントはそれが何であるかを示すのに十分に具体化されていないようです。

4

1 に答える 1

5

少し遅れるかもしれませんが、問題は、my_moduleビルド時にリンクしていないことですmy_wrapper

wrapper = Extension('my_wrapper', sources=['my_wrapper.f90'], libraries=['my_module'])

setup(
    libraries = [('my_module', dict(sources=['my_module.f90'],
                                    extra_f90_compile_args=["-ffixed-form"]))],
    ext_modules = [wrapper]
)

の唯一の使用my_moduleがのためである場合、あなたは単にそれを:my_wrapperのソースに追加することができます。my_wrapper

wrapper = Extension('my_wrapper', sources=['my_wrapper.f90', 'my_module.f90'],
                                  extra_f90_compile_args=["-ffixed-form"])
setup(
    ext_modules = [wrapper]
)

これにより、すべてがPythonにエクスポートされることに注意してください。これはmy_module、おそらく望ましくありません。

私はcmake、最上位のビルドシステムとして使用して、Pythonの外部でこのような2層のライブラリ構造を扱っています。make pythondistutilsを呼び出してPythonラッパーをビルドするように設定しました。はsetup.py、すべての外部ライブラリがすでに構築およびインストールされていると安全に想定できます。Pythonこの戦略は、システム全体にインストールされ、拡張機能を構築する方法が異なる、、、、、...などMatlabのさまざまなアプリケーション用Octaveにラップされた汎用ライブラリが必要な場合に有利です。IDL

于 2013-05-12T08:57:01.503 に答える