私の組織には、私が書いているいくつかの新しい Python ベースのツールに組み込みたいレガシーな fortran コードがたくさんあるので、f2py に頭を悩ませようとしています。理想的には、これらのツールをソース パッケージまたはホイールのいずれかにパッケージ化して、組織の残りの部分に簡単に配布できるようにします。
フロートの配列を合計するだけの他のいくつかの例に基づいて、小さなテスト パッケージを作成しました。パッケージの内容は以下のとおりです。を使用してソース配布の tarball をビルドするとpy setup.py sdist
、すべてが機能するように見えます。pip が正常にインストールされているようにも見えます。ただし、Python シェルを開いて新しくインストールしたモジュールをインポートしようとするとfrom fastadd import fadd
、初期化スクリプトの行にエラーが表示されます。
AttributeError: module 'fastadd' has no attribute 'fastadd'
そのため、実際には f2py モジュールのビルドに成功していないようです。パッケージフォルダーでPowerShellウィンドウを開いて実行した場合、トラブルシューティングを行います
py -m numpy.f2py -c fadd.pyf fadd.f90
次に、同じフォルダーで python シェルを開いて を試してみるとimport fastadd
、エラーが発生しますImportError: DLL load failed: The specified module could not be found.
(これは、Visual Studio ビルド ツールをインストールした後であり、複数のスレッドで修正が提案されています)。このスレッドのアドバイスに従って、コマンドを次のように変更します
py -m numpy.f2py -c --fcompiler=gnu95 --compiler=mingw32 fadd.pyf fadd.f90
正常にインポートして使用できるモジュール ファイルをビルドします。わかりました。
ただしconfig.add_extension
、キーワード引数を含めるようにセットアップ ファイルを変更し、コマンドを使用f2py_options=["--fcompiler=gnu95","--compiler=mingw32"]
してパッケージ配布ファイルをビルドしてから を使用してインストールしようとすると、さらに別のエラーが表示されます。setup.py sdist
py -m pip install fastadd-1.0a1.tar.gz
ERROR: No .egg-info directory found in C:\Users\username\AppData\Local\Temp\pip-pip-egg-info-c7406k03
そして今、私は完全に困惑しています。f2py_options の他の構成では、setup.py
上記と同様に、エラーがスローされるか、拡張機能の作成に完全に失敗します。オプションに単純な文字列を使用するとエラーが発生するため、明らかに f2py_options は実際にはリスト入力を想定しています。正しく使用しているかどうかについての適切なドキュメントが見つからないようですf2py_options
。また、そのオプションを追加するだけで pip がその情報ディレクトリがどこにあるのかわからなくなる理由がわかりません。それは私には意味がありません。これについて何か助けていただければ幸いです。
Windows 10 マシンで Python 3.7.0 32 ビット、numpy 1.20.1、および pip 21.0.1 を実行しています。
- 編集 -
テスト モジュールのインストール ディレクトリを調べたところ、この問題の新たな問題が見つかりました。インストール ディレクトリには、実際には にリストされているファイルは含まれていませMANIFEST
ん__init__.py
。ディレクトリにコピー__init__.py
すると、モジュールをインポートしようとすると、同じImportError: DLL load failed
エラーが発生します。
また、 の出力を調べると、またはが有効なオプションとして認識されていないpy -m pip install
ように見えますが、それらは認識されますが、単に無視されます。numpy.distutils
--fcompiler
--compiler
numpy.f2py
--編集終了--
パッケージ内容:
+-fastadd
---__init__.py
---fadd.f90
---fadd.pyf
-MANIFEST.in
-README
-setup.py
fadd.f90
次の内容があります。
subroutine fadd(vals,n,mysum)
integer, intent(in) :: n
real*8, intent(out):: mysum
real*8, dimension(n), intent(in) :: vals
mysum = sum(vals)
end subroutine fadd
fadd.pyf
次の内容があります。
python module fastadd ! in
interface ! in :fastadd
subroutine fadd(vals,n,mysum) ! in :fastadd:fadd.f90
real*8 dimension(n),intent(in) :: vals
integer, optional,intent(in),check(len(vals)>=n),depend(vals) :: n=len(vals)
real*8 intent(out) :: mysum
end subroutine fadd
end interface
end python module fastadd
__init__.py
:
"""This is the documentation!"""
from .fastadd import fadd
MANIFEST.in
:
include README
recursive-include fastadd *.f90
recursive-include fastadd *.pyf
recursive-include fastadd *.py
そして、最後にsetup.py
:
def configuration(pth=None):
from numpy.distutils.misc_util import Configuration
config = Configuration(
'fastadd',
top_path=pth,
version='1.0a1',
author='John Doe',
author_email='john.doe@fake-org.biz',
url='fake-org.biz/fastadd',
description="Testing f2py build process. Sums an arbitrary-length list of numbers.")
config.add_extension(
'fastadd',
sources=['fastadd\\fadd.pyf','fastadd\\fadd.f90']
)
return config
if __name__ == '__main__':
from numpy.distutils.core import setup
setup(**configuration('fastadd').todict())
MANIFEST
セットアップ スクリプトを実行した後の最終的なファイルは次のようになります。
# file GENERATED by distutils, do NOT edit
README
setup.py
C:\Users\username\Documents\Development\python_modules\fastadd\fastadd\fadd.f90
C:\Users\username\Documents\Development\python_modules\fastadd\fastadd\fadd.pyf
fastadd\__init__.py
fastadd\fadd.f90
fastadd\fadd.pyf