[Python] module ‘xxx’ has no attibute ‘yyy’

[問題] anacondaのパッケージをimportし、ドキュメントにあるとおりモジュールの関数を実行したところ、module ‘xxx’ has no attibute ‘yyy’と表示されて動かない

[原因] module名’xxx’と同じファイル名の.pyファイルがカレントディレクトリに存在する

[解説] Pythonのimportの名前解決ではカレントディレクトリが最も優先されるため、カレントディレクトリにimportしたいmoduleと同じファイル名の.pyファイルがある場合はそれをモジュールとして読み込んでしまう。そのため、当然のことながらanacondaでインストールしたパッケージで定義された関数は存在しないためno attibute ‘yyy’となる。偶然’yyy’が存在する場合、全くおかしな動作をする。

[経緯]

PythonでOpenGLを使ってみようとglfwをanacondaでインストール。このデモプログラムを何を思ったかglfw.pyという名前で保存した。デモプログラムのglfw.pyの中では

import glfw

をしているが、これはanacondaでインストールしたglfwではなく、デモプログラムのglfw.pyが優先して読み込まれるので、つまるところ自分自身をimportしたことになる。この状態でglfwの初期化を行う

glfw.init()

を実行すると、本来はglfwパッケージのinit関数が呼ばれるのだが、自分自身をimportしてしまっているため、自分自身(glfw.py)中にあるinit()関数を探し、見つからなかったためmodule ‘glfw’ has no attribute ‘init()’と言われる。

anacondaのパッケージが壊れているのか等色々調べたがその様子はなく、import glfwしたあとglfw.__file__を調べてみたところ、カレントディレクトリのglfw.pyを読み込んでいることに気づきすべてを悟った。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です