@kyanny's blog

My thoughts, my life. Views/opinions are my own.

ファイル名ではまる

追記

コメントで教えてもらった。カレントディレクトリにあるファイルも import の対象になるので、 crypt.py 自身を import してしまい、二度実行されるように見えていた。やはりファイル名に注意すべき、ということ。


特に面白くもない、 crypt で適当にランダムな文字列を作るプログラム。これを crypt.py という名前で保存して実行すると、不思議なことがおこった。

#!python

import sys, crypt

for i, v in enumerate(sys.argv):
    print i, v, crypt.crypt(v,v)

カレントディレクトリに crypt.pyc というコンパイル済みファイル?らしきものが作られる。そしてエラー。 import crypt とかをコメントアウトして .pyc を消して再び実行すると、なぜかループが二回実行される(for i in sys.argv: で引数が hoge moe なら hoe moe hoge moe と二回ずつ表示されてしまう)。

何が何だかわからなかったけど、保存するファイル名を hoge.py などに変えたら再現しなくなった。

以上の経験から、 Python では標準モジュールと同じ名前の .py ファイルを作ってそのファイル名と同じモジュールを import して実行するといろいろマズイことがおこる、と理解した。ファイル名をかえるか、拡張子をなくせば回避できる。