302 votes

PyLint "Unable to import" error - comment définir PYTHONPATH ?

Je lance PyLint à partir de l'IDE Wing sur Windows. J'ai un sous-répertoire (package) dans mon projet et à l'intérieur du package j'importe un module du niveau supérieur, ie.

__init__.py
myapp.py
one.py
subdir\
    __init__.py
    two.py

A l'intérieur two.py J'ai import one et cela fonctionne bien au moment de l'exécution, parce que le répertoire de premier niveau (à partir duquel le système myapp.py est exécuté) se trouve dans le chemin d'accès à Python. Cependant, lorsque j'exécute PyLint sur two.py, il me donne une erreur :

F0401: Unable to import 'one'

Comment résoudre ce problème ?

4voto

Nate Points 76

J'ai eu le même problème et je l'ai résolu en installant pylint dans mon virtualenv et en ajoutant un fichier .pylintrc à mon répertoire de projet avec ce qui suit dans le fichier :

[Master]
init-hook='sys.path = list(); sys.path.append("./Lib/site-packages/")'

4voto

Devguru Points 91

J'ai trouvé une belle répondre . Editez votre pylintrc et ajoutez ce qui suit dans master

init-hook="import imp, os; from pylint.config import find_pylintrc; imp.load_source('import_hook', os.path.join(os.path.dirname(find_pylintrc()), 'import_hook.py'))"

4voto

Droogans Points 2098

Si vous voulez remonter du module/fichier actuel qui a été remis à pylint à la recherche de la racine du module, c'est ce qu'il faut faire.

[MASTER]
init-hook=sys.path += [os.path.abspath(os.path.join(os.path.sep, *sys.argv[-1].split(os.sep)[:i])) for i, _ in enumerate(sys.argv[-1].split(os.sep)) if os.path.isdir(os.path.abspath(os.path.join(os.path.sep, *sys.argv[-1].split(os.sep)[:i], '.git')))][::-1]

Si vous avez un module python ~/code/mymodule/ avec une structure de répertoire de premier niveau comme suit

~/code/mymodule/
├── .pylintrc
├── mymodule/
│   └── src.py
└── tests/
    └── test_src.py

Ensuite, cela ajoutera ~/code/mymodule/ à votre chemin python et permettre à pylint de s'exécuter dans votre IDE, même si vous importez mymodule.src en tests/test_src.py .

Vous pouvez remplacer un chèque par un .pylintrc mais un répertoire git est généralement ce que vous voulez quand il s'agit de la racine d'un module python.

Avant de demander

Les réponses à l'aide de import sys, os; sys.path.append(...) Il manque quelque chose qui justifie le format de ma réponse. Je n'écris normalement pas de code de cette manière, mais dans ce cas, vous devez faire face aux limitations de l'analyseur et de l'évaluateur de configuration de pylintrc. Il exécute littéralement exec en le contexte du callback init_hook Ainsi, toute tentative d'importation de pathlib Les instructions de type "déclaration à plusieurs lignes", "stockage dans des variables", etc. ne fonctionnent pas.

Une forme moins dégoûtante de mon code pourrait ressembler à ceci :

import os
import sys

def look_for_git_dirs(filename):
    has_git_dir = []
    filename_parts = filename.split(os.sep)
    for i, _ in enumerate(filename_parts):
        filename_part = os.path.abspath(os.path.join(os.path.sep, *filename_parts[:i]))
        if os.path.isdir(os.path.join(filename_part, '.git')):
            has_git_dir.append(filename_part)
    return has_git_dir[::-1]

# don't use .append() in case there's < 1 or > 1 matches found
sys.path += look_for_git_dirs(sys.argv[-1])

J'aurais aimé pouvoir utiliser pathlib.Path(filename).parents cela aurait facilité les choses.

3voto

chuyik Points 409

La clé est d'ajouter le répertoire de votre projet à sys.path sans tenir compte de la variable env.

Pour ceux qui utilisent VSCode, voici une solution en une ligne si vous disposez d'un répertoire de base pour votre projet :

[MASTER]
init-hook='base_dir="my_spider"; import sys,os,re; _re=re.search(r".+\/" + base_dir, os.getcwd()); project_dir = _re.group() if _re else os.path.join(os.getcwd(), base_dir); sys.path.append(project_dir)'

Permettez-moi de l'expliquer un peu :

  • re.search(r".+\/" + base_dir, os.getcwd()).group() : recherche du répertoire de base en fonction du fichier d'édition

  • os.path.join(os.getcwd(), base_dir) : ajouter cwd a sys.path pour répondre à l'environnement de ligne de commande


Pour information, voici mon .pylintrc :

https://gist.github.com/chuyik/f0ffc41a6948b6c87c7160151ffe8c2f

3voto

Nadeem Points 27

Lorsque vous installez Python, vous pouvez définir le chemin d'accès. Si le chemin est déjà défini, vous pouvez, dans VS Code, appuyer sur Ctrl+Shift+P et taper Python : Select Interpreter et sélectionnez la version mise à jour de Python. Suivez ce lien pour plus d'informations, https://code.visualstudio.com/docs/python/environments

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X