「ゼロから作るDeep Learning 」でエラー「ModuleNotFoundError: No module named ‘dataset.mnist’」が発生した時の対応方法

「ゼロから作るDeep Learning 」のこちらのサンプルコードを実行した際に起きたエラーの原因と対応についてまとめました。

原因

原因はモジュール検索パスの一覧に「..」と追加されていたためでした。

対応

以下のコードを修正しました。

修正前

sys.path.append(os.pardir)

修正後

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)))

修正後の処理内容については以下の通りになります。

__file__

現在実行中のPythonスクリプトのファイルパスを指します。test.pyというpyファイルを実行した場合、「/home/username/deep-learning-from-scratch/ch03/test.py」と返ってきます。(以後同様のpyファイルを実行したものとして説明)

os.path.dirname(__file__)

__file__のディレクトリパスを取得します。「/home/username/deep-learning-from-scratch/ch03」と返ってきます。

os.pardir

親ディレクトリ「..」を指します。「..」と返ってきます。

os.path.join(os.path.dirname(__file__), os.pardir)

os.path.dirname(__file__)で返された文字列の後ろにos.pardirで返された文字列を結合します。「/home/username/deep-learning-from-scratch/ch03/..」が返されます。

os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))

相対パスを絶対パスに変換します。「/home/username/deep-learning-from-scratch」が返されます。

余談

以下のコードでそれぞれ実行した際に値として何が取得できているのか確認可能です。sysやosライブラリを扱う機会がほとんどなかったため、各挙動についてprintして確認しました。自分は「ch03」ディレクトリに「test.py」ファイルを作成しました。

import sys, os

# pyファイルがコマンドラインから直接実行されると、特殊な変数__name__に__main__という値を設定する。
if __name__ == '__main__':
    # ★モジュール検索パスの一覧を表示
    for path in sys.path:
        print(path)
    
    # 親ディレクトリのパスを取得
    # __file__:現在実行中のPythonスクリプトのファイルパスを指します。
    # os.path.dirname(__file__):__file__のディレクトリパスを取得します。/path/to/your_script.pyであれば、/path/toが返されます。
    # os.pardir:親ディレクトリ「..」を指します。
    # os.path.join(os.path.dirname(__file__), os.pardir):os.path.dirname(__file__)/..が返されます。
    # os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)):相対パスを絶対パスに変換します。
    parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
    print(f"__file__ : {__file__}")
    print(f"os.path.dirname(__file__) : {os.path.dirname(__file__)}")
    print(f"os.pardir : {os.pardir}")
    print(f"os.path.join(os.path.dirname(__file__), os.pardir) : {os.path.join(os.path.dirname(__file__), os.pardir)}")
    print(f"os.path.join(os.pardir, os.path.dirname(__file__)) : {os.path.join(os.pardir, os.path.dirname(__file__))}")
    print(f"os.path.abspath(os.pardir) : {os.path.abspath(os.pardir)}")
    print(f"os.path.abspath(os.path.dirname(__file__)) : {os.path.abspath(os.path.dirname(__file__))}")
    print(parent_dir)

参照

[1]https://note.com/soena/n/n4eb7f826b4e9

コメント

タイトルとURLをコピーしました