web-dev-qa-db-fra.com

erreur d'importation de vscode pour python

J'essaie de faire une importation dans python d'un niveau de répertoire vers le haut.

import sys

sys.path.append('..')
from cn_modules import exception

J'obtiens une erreur de VSCode lorsque j'essaie d'exécuter la tâche de génération en tant que:

ImportError: aucun module nommé cn_modules

Le même code fonctionne sans aucune erreur du terminal (python).
Je rencontre le problème lorsque j'essaie de l'exécuter à partir de la tâche d'exécution de construction de VSCode.
Un indice sur ce qui ne va pas ici?

Avoir passé du temps tranquille mais pas en mesure de résoudre ce problème, toute aide est appréciée.


REMARQUE: cela fonctionne lorsque je débogue également avec vscode. Ci-dessous ma configuration pour launch.json et tasks.json

launch.json

 {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Python Console App",
                "type": "python",
                "request": "launch",
                "stopOnEntry": true,
                "program": "${file}",
                "externalConsole": true,
                "debugOptions": [
                    "WaitOnAbnormalExit",
                    "WaitOnNormalExit"
                ],
                "env": {},
                "envFile": "${workspaceRoot}/.env",
                "console":"integratedTerminal",
                "pythonPath": "${config:python.pythonPath}"
            }
        ]
    }

tasks.json

{
        "version": "0.1.0",
        "command": "/usr/bin/python",
        "isShellCommand": true,
        "args": ["${file}"],
        "showOutput": "always",
        "env": {},
        "envFile": "${workspaceRoot}/.env",
        "pythonPath": "${config:python.pythonPath}"
 }
18
Chandan Nayak

J'ai essayé d'ajouter ceci dans mon launch.json, alors ça marche!

"env": {"PYTHONPATH": "${workspaceRoot}"}

ci-dessous est mon launch.json

        "name": "Python: Current File (Integrated Terminal)",
        "type": "python",
        "request": "launch",
        "program": "${file}",
        "cwd": "${workspaceRoot}",
        "env": {"PYTHONPATH": "${workspaceRoot}"},
        "console": "integratedTerminal"

souhaite que cela puisse vous aider! :)

20
PhilipWu

Cette solution m'aide à résoudre ce problème de manière permanente. Les étapes sont données ci-dessous.

  1. Appuyez sur "Ctrl + Maj + P"
  2. Type: "Configurer le paramètre spécifique à la langue"
  3. Sélectionnez ensuite "Python"
  4. "settings.json" s'ouvrira. Archivez ce fichier json s'il existe une ligne comme celle-ci: {"python.jediEnabled": false} (Appuyez sur "Ctrl + F" puis collez le lien ci-dessus pour le trouver rapidement)
  5. Si oui, supprimez ou commentez cette ligne, enregistrez le fichier et rechargez VScode.
  6. TERMINÉ!
3
Mubashar javed

Merci Honza Kalfus jankalfus

J'ai remarqué que si j'utilise Fichier -> Fermer le dossier puis Fichier -> Ouvrir le dossier ... et rouvrir le dossier du projet, les erreurs ont disparu. Si je redémarre simplement VS Code à la place, je continue à recevoir les erreurs. Je suppose qu'un cache interne est effacé?

Trouvé ici https://github.com/Microsoft/vscode/issues/10391

3
dcarl661

J'ai eu le même problème, dans mon cas, il était dû au fait que le répertoire actuel du processus de débogage vscode était différent du répertoire dans lequel se trouvait le script. Il est utile de faire un

print('cwd is %s' %(os.getcwd()))

Juste avant votre sys.path.append et vos importations. Ce qui m'est arrivé, c'est que l'environnement d'exécution cwd semble être par défaut le répertoire de l'espace de travail, qui semble être le répertoire contenant le fichier de projet vs code, et si ce n'est pas là où se trouve votre script, alors vos chemins d'inclusion relatifs sont rompus.

Une solution à cela est de vous assurer que votre script change son répertoire actuel dans le répertoire où se trouve le script, et également d'ajouter votre syspath au répertoire où se trouve le script:

scriptdir = os.path.dirname(os.path.realpath(__file__))
print('dir containing script is %s' % (scriptdir))

# append our extra module directory (in this case Autogen) onto the script directory

sys.path.append(os.path.join(scriptdir, 'Autogen'))

# also change cwd to where the script is located (helps for finding relative files)
print('============\ncwd is %s' %(os.getcwd()))

os.chdir(scriptdir)
print('============\ncwd after change to script dir is %s' %(os.getcwd()))

Toutes les étapes ci-dessus aideront à faire fonctionner correctement votre script, mais elles ne contribueront pas à l'intellisense ou à l'achèvement du code. Pour que l'exécution du code s'exécute correctement, vous devez créer un .env fichier (généralement dans le même répertoire que votre répertoire .vscode) et dans votre fichier .env vous ajoutez les répertoires où vous voulez que vscode recherche des modules supplémentaires python

Contenu du fichier .env

PYTHONPATH="someDirRelativeTowhereYourVSCodeProjectLives\\Autogen"
0
Paulus

Dans mon cas, cela n'a rien à voir avec

"env": {"PYTHONPATH": "${workspaceRoot}"}

Voici ma structure de dossier/module:

/Dev/csproj/deploy/test.py 
/Dev/csproj/util/utils.py

et dans test.py, il importe la fonction utils

import sys
sys.path.append('../')
from util.utils import get_keyvault_secret

Il n'a aucun problème si j'exécute test.py dans le dossier terminal/Dev/csproj/deploy /.
Mais si je veux déboguer test.py, j'ai eu l'exception de "ModuleNotFoundError"
Pour le corriger, j'ajoute ceci à ma configuration de débogage launch.json

"cwd": "${workspaceRoot}\\Dev\\csproj\\deploy",
0
Dylan Wang