とある日。
とある日に、メインファイルに自作パッケージをimportしてまとめようとしていた。
だが、うまく行かない。
理由はわかっている。前にも開発で同じことを行って原因を解決しているため前回行った解決方法を行おうとしていた。
これは、課題作成を行っているなかで、Python3.8.0でAPI作成をしてたときに起こったimport自動整形悲劇である。
行っていた開発のファイル構成はこんな感じ。
Python ├─database ---データベースに関するファイル │ ├─データベース接続.py │ └─SQL発行.py │ ├─lib ---ライブラリーに関するファイル │ └─lib.py │ └─main ---実際に呼ばれるAPIに関するファイル ├─main.py └─API.py
行いたいこと
main.pyからlib.pyを読み込むためimportをしたい。
from ..lib import lib
コレで行けるはずなのだがエラーが出力される。
ImportError: attempted relative import with no known parent package
from や import の記述を変更してもうまく行かない。
なので最終手段のsys.path にモジュールのあるパスを追加する方法を取ろうと考えた。
sys.path.append("C:\\Users\\....\\Python\\") from lib import lib
コレで行けると思い保存した所事件は起こった。
事件
ModuleNotFoundError: No module named 'lib'
なんでだ!?!?
該当部分を見てみると.....
from lib import lib sys.path.append("C:\\Users\\....\\Python\\")
あれ入れ替わってる....何で。
#理想 sys.path.append("C:\\Users\\....\\Python\\") from lib import lib #現実 from lib import lib sys.path.append("C:\\Users\\....\\Python\\")
pathを追加してからそのpathを頼りにimportをしてほしい。
とりあえず、もう一度入れ替えて保存すると、勝手に入れ替わる。
まず行ったこと
自分は、VScodeで開発していて、コードの自動整形の拡張機能を導入している。
なので、それが意図しない整形を行っているのだとすぐに気がついた。
じゃあ、その機能オフにしようかと思い設定を開き下記の項目をオフにした。
- Format On Type
エディターで入力後に自動的に行のフォーマットを行うかどうかを制御します。
コレで行けると思いまた保存するとまた入れ替わる。
次に行ったこと
Python3自動整形で探す。 それらしい項目を見つけた。
"python.linting.lintOnSave": false,
これも無効にしてみた。
が!!まだ自動整形せれる。
最後の行ったこと
そこで、保存時にコード整形を自動で行う設定があるのを思い出し。 それも無効にした。
- Format On Save
ファイルを保存するときにフォーマットします。フォーマッタが有効でなければなりません。ファイルの遅延保存やエディターを閉じることは許可されていません。
コレも無効にした。
すると、入れ替わらなくなった。
解決方法
下記の項目全てを無効にすると自分の環境ではimportの入れ替わりはなくなった。
1つだけ、settings.jsonを変更することになるがこれでいけた。
ただし、1つでも有効だと自動整形されていましうので注意が必要と。
Format On Type
Format On Save
python.linting.lintOnSave
コレを行ったときの注意点
これら全てを無効にすると、自動整形自体が機能しなくなるのでお気をつけて。
まとめ
以前の開発では、起きなかった自動整形によってpathが通らなくなってしまう現象。
一応他にも解決方法として、環境変数を設定することで解決はするようですが、諸事情によりそちらの案は採用しませんでした。
原因解明するまでに、かなりの時間を要した。
それも、VScodeに拡張機能を入れすぎて管理できなくなったことや、
Pythonのimportについて曖昧に覚えていたために起きてしまった。
Pythonについてもっと勉強しなければ・・・・。
そう己に言い聞かすのであった。