VSCodeのPylintがimportでうざい!!!!


この記事は、エラーの握りつぶしに近い行為を行っています。
一通り問題が解決したら、こちらの記事(https://qiita.com/ysk24ok/items/2711295d83218c699276) も読むべきです。

初めに

VSCodeのPylintがimportでうざい!!!!
っていきなりなんだい。って話ですが、

VSCodeでPythonを書くとき、
自作モジュールを相対インポートしようとすると、必ずと言っていいほどエラーが出ます。

0.環境

グローバル環境(仮想環境を使用せず)で以下のディレクトリ構造です。

~
-Sample
 -main.py
 -__init__.py
 -sub_methods
  -method1.py
  -method2.py
-out.py

それぞれ、以下のコードを持ちます。

main.py
print("main")
from sub_methods import method1
__init__.py
print("__init__")
import os
originaly = os.getcwd
os.chdir(os.path.dirname(os.path.abspath(__file__)))
from . import main
os.chdir = originaly
method1.py
print("method1")
import method2
#from sub_methods import method2
method2.py
print("method2")
out.py
print("out")
from Sample import main

1.unresolved import

この状態でもワーニングがわんさか出ています。

このunresolved import '...'というのは、ワークスペースのルートから一層以上深いと、相対インポートしたときに出てきやがります。

未解決って言われましても…って感じですね。
これを落ち着かせるには、

Ctrl + Shift + P>Settings.jsonを開いて

"python.jediEnabled": false"python.jediEnabled": trueにするか
この項自体を削除します。

2.Unable to import

うるせぇ!俺はmainを直接起動するからカレントディレクトリはSampleなんだよ!!!!

…え?outから起動して
from sub_methods import method1from .sub_methods import method1
に書き換えろって…?
ワークルートとカレントディレクトリをずらすな…?

チッ うっせーよ… 反省してま~す

冗談はさておき、mainのみではなく、method1からmethod2を呼び出すとすると、
どうしてもSampleをカレントディレクトリとしてimportを行うことになります。

method1.py
print("method1")
import method2
#from sub_methods import method2
output
ModuleNotFoundError: No module named 'method2'

変更>

method1.py
print("method1")
#import method2
from sub_methods import method2
output
main
method1
method2

こう書くしかないのに、エラーなんて出されてたら気が散って仕方ありません。
これは、カレントディレクトリ(ここではSample)を、Pylintにライブラリフォルダーと認識させることで抑制することができます。

lib
-os
 -...
-numpy
 -...
...

が、デフォルトのライブラリ認識だとしたらここに

lib
-os
 -...
-numpy
 -...
-main
-sub_methods
 -method1
 -method2

といった感じに認識させれば
from os import pathなどと同じようにfrom sub_methods method2を書いても怒られないはずです。

そこで、ワークルートのフォルダに、以下のファイルを作ります

pylintrc
init-hook="./Sample"

これでlintを再読み込み、またはVSCodeを再起動すると、エラーが表示されなくなったはずです。

まとめ

1."python.jediEnabled": falseを"python.jediEnabled": trueにするか
この項自体を削除します。
2.ワークルートのフォルダにpylintrcを作って、init-hookにmain.pyが含まれるフォルダを与えます。

この記事は、エラーの握りつぶしに近い行為を行っています。
一通り問題が解決したら、こちらの記事(https://qiita.com/ysk24ok/items/2711295d83218c699276) も読むべきです。