web-dev-qa-db-ja.com

venvの使用中にvscodeでpylint false positive E0401インポートエラーが発生する

このフォルダーのMac OSでpython3.6を使用してvenvを作成しました/Users/kim/Documents/Apps/PythonApps/python36-miros-a3

私はpip install pylint仮想環境をアクティブにした後

私のワークスペースは/Users/kim/Documents/Apps/WebApps/miros-a3

Vscodeワークスペース内には、次のワークスペース設定があります

{
    "folders": [
        {
            "path": "."
        }
    ],
    "settings": {
        "python.pythonPath": "/Users/kim/Documents/Apps/PythonApps/python36-miros-a3/bin/python3.6",
        "python.venvPath": "/Users/kim/Documents/Apps/PythonApps"
    }
}

パイリントのカスタムパスを設定し、venvpathも変更しようとしました。

パイリントは、インポート文が存在しないと言って文句を言い続けました。

enter image description here

enter image description here

ご覧のとおり、これらは同じフォルダーにあり、間違いなくpythonファイルを実行できます。

このような誤検知のインポートエラーを回避するにはどうすればよいですか?

私も次のことを試しました:

  1. コマンドラインに移動して仮想環境をオンにし、codeと入力してここで推奨されているようにvscodeをアクティブにします https://code.visualstudio.com/docs/setup/mac
  2. これも試しました https://donjayamanne.github.io/pythonVSCodeDocs/docs/troubleshooting_linting/
10
Kim Stacks

Pylintにはいくつかの癖があります。この場合、モジュールはvenvパスのサブディレクトリにあるため、モジュールの場所がわかりません。これを解決するには:

  1. この設定をワークスペースまたはフォルダーの設定に追加します。

    "python.linting.pylintArgs": [
        "--init-hook",
        "import sys; sys.path.append('<path to folder your module is in>')"
    ]
    

    または、多分良い

  2. .pylintrcファイルを生成します。 venvが起動された統合端末から実行:

    pylint --generate-rcfile > .pylintrc 
    

    次に、生成されたファイルを開き、init-hook =のコメントを外します:

    init-hook='import sys; sys.path.append("<path to folder you module is in>")'
    

    必要に応じて、。pylintrcおよびTweak設定を読み取ります。どちらの場合も、パスは「データベース」フォルダーを指す必要があります。

  3. パイリント設定について学習した後、正しい方法でそれを行います:

    from database.database_dispatcher import ...
    

    Anthony Sottileによる this answer を参照してください。

8
Braca

私にとって、pylintはこのエラーにフラグを立てるのに正しい

最上位モジュールはdatabaseです(__init__.pyファイルが含まれます)

インポートは次のようになります(完全に絶対)

from database.database_dispatcher import ...

または(明示的な相対)(はい!モジュール名の前の.は意図的です)

from .database_dispatcher import ...

私のフォローアップの推測では、あなたは現在python ./database/main.py ...の先頭に./databaseを置くsys.pathとしてスクリプトを呼び出しているので、が表示されますインポートが正しく機能していること-これはモジュール構造を回避しています。代わりにpython -m database.main ...を使用してスクリプトを呼び出す必要があります。

暗黙的相対インポートは、python 3.x-この(imo)スクリプトのいぼsys.path挿入は残ります。

5
Anthony Sottile

私の状況でそれをどのように修正したかについての私の0.02ドルです。

私の問題は、pylintをグローバルにインストールし、venvでコーディングすることに完全に関連していました。 vscodeは、Python venv。this answer にインストールした依存関係を認識していないグローバルにインストールされたパイリントを使用しようとしました-)私の問題を解決しました。それは ここ を指し、私のプロジェクトのvenvを使用してvscodeを設定する方法を説明しました。リンティングツールがインストールされていないとの警告が表示され、インストールを促されました。

2
Gatmando