親ディレクトリの小ディレクトリからimportしたい時

また問題にハマりました。

f:id:XTJP:20191024121350p:plain f:id:XTJP:20191024121413p:plain

「ゼロから始めるディープラーニング」を進めていますが、40%くらい読み進めたところで、ch04/two_layer_net.py のコードの中で、common/functions.pyの中にあるモジュールを読みたかったんです。

sys.path.append(os.pardir)

を実行しようとすると、

そのディレクトリにcommonってmoduleはないよーん というエラー。とりあえずいつもどおり調べてみると、

github.com

この本の公式のGithubに同じ内容でハマっている方がいらっしゃって、そこの解決策として以下のコードが提案されていました。

sys.path.append(os.path.abspath('..'))

これに書き換えてみるも、同じエラーです。   そもそも、

sys.path.append(os.pardir)

これが何をしているか調べてみると、

Python Tips:ライブラリ読み込み対象ディレクトリを追加したい - Life with Python

Python で特定のディレクトリをライブラリ読み込み対象パスに追加しているようです。

ということは、悪さをしているのは os.pardir なのでしょう。macだからだめなのかなあ。

と思い、この部分を書き換える方法を調べてみました。

note.nkmk.me

によると、 絶対インポート相対インポートという概念があるらしく、どうやら今回は後者をやろうとしているみたいです。フルパスを指定して絶対インポートにすればすんなり解決したのですが、os.pardirが機能しない理由は謎のままです。 このサイトで紹介されている from ..dir_for_mod import mod2 というような、一回上の階層にいって下の別の階層に下がる、というようなことができれば自由自在に相対インポートし放題なんですけどね... これも私の環境ではだめでした。