[問題] 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を読み込んでいることに気づきすべてを悟った。