Pythonコードで使うモジュール名と同じファイル名は使っちゃだめ

タイトル通りなんだけど。自分でバカなことしたなーという記録と備忘録として。
やっちゃダメ絶対。

発端

Pythonで設定を自動化しよう!と思ってpexpectモジュールを使ってコードを書きました。すんげー単純に言えばこんな感じ。

from pexpect import pxssh

s = pxssh.pxssh()
s.login(hostname, 'testuser', 'testpass')
s.logout()

なぜかエラー

んで実行すると、エラーになる。

$ python3 pexpect.py
Traceback (most recent call last):
  File "pexpect.py", line 1, in <module>
    from pexpect import pxssh
  File "/root/pexpect.py", line 1, in <module>
    from pexpect import pxssh
ImportError: cannot import name 'pxssh'

あーそっか、pexpectインストールしてなかったねー、ってのでインストール。

$ sudo pip3 install pexpect
Collecting pexpect
  Downloading https://files.pythonhosted.org/packages/89/e6/b5a1de8b0cc4e07ca1b305a4fcc3f9806025c1b651ea302646341222f88b/pexpect-4.6.0-py2.py3-none-any.whl (57kB)
    100% |################################| 61kB 974kB/s
Collecting ptyprocess>=0.5 (from pexpect)
  Downloading https://files.pythonhosted.org/packages/ff/4e/fa4a73ccfefe2b37d7b6898329e7dbcd1ac846ba3a3b26b294a78a3eb997/ptyprocess-0.5.2-py2.py3-none-any.whl
Installing collected packages: ptyprocess, pexpect
Successfully installed pexpect-4.6.0 ptyprocess-0.5.2

そして実行…してもエラー

$ python3 pexpect.py
Traceback (most recent call last):
  File "pexpect.py", line 1, in <module>
    from pexpect import pxssh
  File "/root/pexpect.py", line 1, in <module>
    from pexpect import pxssh
ImportError: cannot import name 'pxssh'

そんなばかな!pexpectインストールしたよ?
なんでImportErrorになるのよ!?

はたと気づく

あれ?実行したディレクトリになんかごみがあるぞ?

$ ls
__pycache__  pexpect.py

__pycache__ってなんでできるんだろう…?と思ってぐぐるとこんなお話が。

__pycache__と.pycファイル | Python学習講座

自前のpythonモジュールをimportすると自動的にpycacheというディレクトリが作成され、配下に.pycファイルが作成されます。

自前のpythonモジュールなんてimportしてないんだけど…

って、作ったファイル名とimportしたいモジュール名が同じじゃないの!これか?

ってことでファイル名を変えてみる

ちゃんとコードの内容で引っかかるようになった。良かったー!

$ mv pexpect.py pxsshtest.py
$ python3 pxsshtest.py
Traceback (most recent call last):
  File "pxsshtest.py", line 4, in <module>
    s.login(address, 'testuser', 'testpass')
NameError: name 'address' is not defined

教訓

使いたいモジュールとファイル名が同じにならないようにしましょう。
(なんでこんな基本的なこと忘れてたのか…)

コメント

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