【初心者向け】NumPy Packaging で Fortran ファイルを扱う:has_f_sources() 関数の使い方


この関数は、以下の引数を取ります。

  • sources: 検査対象のソースコードファイルのリスト

この関数は、sources リスト内の各ファイルを調べ、Fortran ファイル拡張子 (例: .f, .f90) を持つファイルが存在するかどうかを確認します。 少なくとも 1 つの Fortran ファイルが見つかれば、関数は True を返します。 Fortran ファイルが見つからない場合は、関数は False を返します。

この関数の主な用途は以下の通りです。

  • Fortran コードを含むソースファイルを処理する
  • Fortran コンパイラが必要かどうかを判断する
  • Fortran コードを含む拡張モジュールのビルドを判断する

from numpy.distutils.misc_util import has_f_sources

sources = ["myfile.c", "myfile.f", "myfile.cpp"]

if has_f_sources(sources):
    print("ソースコードリストに Fortran ファイルが含まれています。")
else:
    print("ソースコードリストに Fortran ファイルは含まれていません。")

この例では、sources リストには C、Fortran、C++ ファイルが含まれています。 has_f_sources() 関数は myfile.f ファイルを見つけるため、True を返します。

  • numpy.distutils.misc_util.has_f_sources() 関数は、ソースコードファイルのリストのみを検査します。 ソースコードディレクトリ全体を検査するには、numpy.distutils.misc_util.is_sequence() 関数と組み合わせて使用する必要があります。
  • Fortran ファイルを処理するには、Fortran コンパイラがインストールされている必要があります。
  • numpy.distutils.misc_util.has_f_sources() 関数は、NumPy の Packaging モジュールの一部です。 このモジュールは、NumPy の拡張モジュールのビルドとインストールを容易にするためのツールを提供します。


from numpy.distutils.misc_util import has_f_sources

# ソースコードファイルのリスト
sources = [
    "myfile.c",
    "myfile.f",
    "myfile.cpp",
]

# Fortran ファイルが含まれているかどうかを確認する
if has_f_sources(sources):
    print("ソースコードリストに Fortran ファイルが含まれています。")

    # Fortran コンパイラが必要かどうかを判断する
    if has_f_compiler():
        print("Fortran コンパイラがインストールされています。")
    else:
        print("Fortran コンパイラがインストールされていません。")

else:
    print("ソースコードリストに Fortran ファイルは含まれていません。")
  1. 最初に、numpy.distutils.misc_util モジュールから has_f_sources() 関数をインポートします。
  2. 次に、検査対象のソースコードファイルのリストを作成します。 このリストには、C、Fortran、C++ ファイルが含まれています。
  3. has_f_sources() 関数を使用して、ソースコードリストに Fortran ファイルが含まれているかどうかを確認します。 関数は True を返します。
  4. Fortran ファイルが見つかったため、Fortran コンパイラが必要かどうかを判断します。 has_f_compiler() 関数を使用して、Fortran コンパイラがインストールされているかどうかを確認します。 関数は True を返します。
  5. Fortran コンパイラがインストールされているため、Fortran コンパイラがインストールされていることを示すメッセージが表示されます。
  6. ソースコードリストに Fortran ファイルが見つからない場合は、Fortran ファイルが含まれていないことを示すメッセージが表示されます。
  • numpy.distutils.misc_util.is_sequence() 関数を使用して、ソースコードディレクトリ全体を検査できます。
  • has_f_sources() 関数の結果に基づいて、さまざまなアクションを実行できます。 たとえば、Fortran コンパイラが必要な場合は、Fortran コンパイラを使用して拡張モジュールをビルドできます。
  • さまざまな種類のソースコードファイルが含まれるより複雑なソースコードリストを使用できます。


手動で拡張子を確認する

最も単純な方法は、ソースコードファイルの拡張子を個別に確認することです。 以下のコードは、この方法の例です。

sources = ["myfile.c", "myfile.f", "myfile.cpp"]

for source in sources:
    if source.endswith((".f", ".f90", ".f95", ".f15")):
        print(f"{source} は Fortran ファイルです。")

このコードは、sources リスト内の各ファイルの拡張子を調べ、Fortran ファイル拡張子 (例: .f, .f90) を持つファイルが存在するかどうかを確認します。 Fortran ファイルが見つかれば、ファイル名がプリントされます。

glob モジュールを使用する

glob モジュールを使用して、Fortran ファイル拡張子を持つファイルを検索することもできます。 以下のコードは、この方法の例です。

import glob

sources = glob.glob("*.[fF90f95f15]")

if sources:
    print("ソースコードディレクトリに Fortran ファイルが見つかりました。")
else:
    print("ソースコードディレクトリに Fortran ファイルは見つかりませんでした。")

このコードは、現在のワーキングディレクトリにあるすべての Fortran ファイルを検索します。 検索が成功した場合は、Fortran ファイルが見つかったことを示すメッセージが表示されます。 検索が失敗した場合は、Fortran ファイルが見つからないことを示すメッセージが表示されます。

pathlib モジュールを使用する

from pathlib import Path

sources_dir = Path(".")

for source in sources_dir.glob("*.f[0-9]*"):
    print(f"{source} は Fortran ファイルです。")

どの方法を選択するべきですか?

どの方法を選択するかは、個々のニーズによって異なります。

  • pathlib モジュールを使用すると、Fortran ファイル拡張子を持つファイルをより柔軟に検索できます。 ただし、この方法は glob モジュールよりも複雑です。
  • glob モジュールを使用すると、Fortran ファイル拡張子を持つファイルを簡単に検索できます。 ただし、この方法は現在のワーキングディレクトリにのみ限定されます。
  • 最も単純な方法は、手動で拡張子を確認することです。 ただし、この方法はソースコードリストが長くなるにつれて煩雑になります。
  • Fortran コンパイラが必要かどうかを判断するには、numpy.distutils.misc_util.has_f_compiler() 関数を使用できます。
  • 上記の代替方法はすべて、Fortran ファイル拡張子 (例: .f, .f90) を使用する基本的な方法です。 独自の拡張子を持つ Fortran ファイルを処理する場合は、コードを適宜変更する必要があります。