注)importの仕様には注意しましょうねという話で、初級者向けの内容です。
Pythonでとある機能のテストをしていた時のこと。
昨日は動いていた次のサンプルコードが突然エラーを出すようになりました。
環境はpyenv+pipenv+python3.7+Google Cloud SDK
(Google Firestoreの書き込みを行うコードです)
from google.cloud import firestore
db = firestore.Client()
db.collection(u'users').document().set({
u'first': u'oda',
u'last': u'nobunaga',
u'born': 1534
})
エラーの内容は次のとおり
>> pipenv run insert
Loading .env environment variables...
Traceback (most recent call last):
File "insert.py", line 1, in <module>
from google.cloud import firestore
File "/mnt/v01/workspace/sandbox-python-firestore/.venv/lib/python3.7/site-packages/google/cloud/firestore.py", line 18, in <module>
from google.cloud.firestore_v1 import __version__
File "/mnt/v01/workspace/sandbox-python-firestore/.venv/lib/python3.7/site-packages/google/cloud/firestore_v1/__init__.py", line 17, in <module>
from pkg_resources import get_distribution
File "/mnt/v01/workspace/sandbox-python-firestore/.venv/lib/python3.7/site-packages/pkg_resources/__init__.py", line 33, in <module>
import platform
File "/home/dev-user/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/platform.py", line 116, in <module>
import sys, os, re, subprocess
File "/home/dev-user/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/subprocess.py", line 140, in <module>
import select
File "/mnt/v01/workspace/sandbox-python-firestore/select.py", line 3, in <module>
db = firestore.Client()
AttributeError: module 'google.cloud.firestore' has no attribute 'Client'
普段からPythonを愛でておられる方々は薄々感じていると思いますが、pyenvとpipenvを同時に使用している状況でのimport errorなので、嫌な予感がします。
けれど、昨日はちゃんと動いていたのです。gcloud authあたりも心配になってきます。
ここで、奇妙な事に気づきます。
File "/mnt/v01/workspace/sandbox-python-firestore/select.py", line 3, in <module>
db = firestore.Client()
なぜか、
呼んでいないはずの./select.pyが登場しています。確かに、先ほどサンプルコードとして./にselect.pyを作成していました。
この./select.pyを削除するとプログラムは正常に動作するようになりました。
結局
処理中に使用されていたsubprocess.pyからカレントディレクトリのselect.pyが呼ばれてしまっていたようです。
今回は一人で作成していたサンプルプログラムだったから良かったのですが、Pythonで特にチーム開発している際はファイル名にも注意が必要なのかと、背筋に冷たいものが走ったエラーでした。