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 ?

3voto

Tout d'abord, allez dans votre code VS puis appuyez sur "ctrl + shift + p"

Ensuite, recherchez settings.json

Ensuite, collez le code ci-dessous à l'intérieur des paramètres.jason.j'espère que le problème sera résolu.

{

"python.pythonPath": "venv/bin/python",
"python.linting.pylintPath": "venv/bin/pylint"

}

3voto

YU GU Points 11

J'ai obtenu cette erreur en essayant de soumettre un PR. Ce que j'ai fini par faire, c'est d'ajouter #pylint : disable=E0401 sur la même ligne que celle où se trouve "import".

Cela m'aide à réussir le test automobile.

2voto

EMP Points 17246

Une solution que je viens de découvrir consiste à exécuter PyLint pour l'ensemble du paquet, plutôt que pour un seul fichier. D'une manière ou d'une autre, il parvient alors à trouver le module importé.

2voto

user2826500 Points 1

J'ai eu le même problème et comme je n'ai pas trouvé de réponse, j'espère que cela pourra aider ceux qui ont un problème similaire.

J'utilise flymake avec epylint. En gros, ce que j'ai fait, c'est ajouter un dired-mode-hook qui vérifie si le répertoire dired est un répertoire de paquets python. Si c'est le cas, je l'ajoute au PYTHONPATH. Dans mon cas, je considère qu'un répertoire est un package python s'il contient un fichier nommé "setup.py".

;;;;;;;;;;;;;;;;;
;; PYTHON PATH ;;
;;;;;;;;;;;;;;;;;

(defun python-expand-path ()
  "Append a directory to the PYTHONPATH."
  (interactive
   (let ((string (read-directory-name 
          "Python package directory: " 
          nil 
          'my-history)))
     (setenv "PYTHONPATH" (concat (expand-file-name string)
                  (getenv ":PYTHONPATH"))))))

(defun pythonpath-dired-mode-hook ()
  (let ((setup_py (concat default-directory "setup.py"))
    (directory (expand-file-name default-directory)))
    ;;   (if (file-exists-p setup_py)
    (if (is-python-package-directory directory)
    (let ((pythonpath (concat (getenv "PYTHONPATH") ":" 
                  (expand-file-name directory))))
      (setenv "PYTHONPATH" pythonpath)
      (message (concat "PYTHONPATH=" (getenv "PYTHONPATH")))))))

(defun is-python-package-directory (directory)
  (let ((setup_py (concat directory "setup.py")))
    (file-exists-p setup_py)))

(add-hook 'dired-mode-hook 'pythonpath-dired-mode-hook)

J'espère que cela vous aidera.

2voto

Mike C Points 572

Il s'agit d'une vieille question qui n'a pas de réponse acceptée, donc je vais suggérer ceci : changez la déclaration d'importation dans two.py pour qu'elle se lise comme suit :

from .. import one

Dans mon environnement actuel (Python 3.6, VSCode utilisant pylint 2.3.1), cela efface la déclaration marquée.

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