Ошибка импорта vscode для модуля Python

Я пытаюсь выполнить импорт в Python с одного уровня каталога выше.

import sys

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

Я получаю сообщение об ошибке от VSCode, когда пытаюсь выполнить задачу сборки как:

ImportError: нет модуля с именем cn_modules

Тот же код работает без ошибок из терминала (python).
Я сталкиваюсь с проблемой, когда пытаюсь запустить его из задачи VSCode Run Build.
Есть какие-нибудь подсказки о том, что здесь не так?

Некоторое время провели в тишине, но не смогли решить эту проблему. Любая помощь приветствуется.


ПРИМЕЧАНИЕ: это работает, когда я тоже отлаживаю с помощью vscode. Ниже моя конфигурация для launch.json и 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}"
 }

person Chandan Nayak    schedule 02.10.2017    source источник
comment
на один уровень каталога выше ... от где? Известно ли вам о текущем рабочем каталоге? Если вы хотите перейти в каталог из местоположения вашего скрипта, вам нужно сначала найти путь к вашему скрипту.   -  person Aran-Fey    schedule 02.10.2017
comment
У меня нет проблем с запуском кода на питоне, он работает. Я столкнулся с проблемой при попытке запустить то же самое из задачи сборки vscode.   -  person Chandan Nayak    schedule 02.10.2017
comment
Где задача сборки устанавливает CWD (текущий рабочий каталог)?   -  person ifconfig    schedule 02.10.2017
comment
Это известная проблема с VSCode, и установка cwd и т.п. НЕ работает.   -  person gented    schedule 04.12.2018
comment
@ChandanNayak нашли решение этой проблемы? Испытывают похожее поведение. import работает через терминал, но не в vscode.   -  person Josmoor98    schedule 06.12.2019
comment
@ Josmoor98 Нет, я этого не делал, и я начал использовать pycharm. Так что не заглядывал в это снова.   -  person Chandan Nayak    schedule 06.12.2019
comment
@ChandanNayak, спасибо за ответ, возможно, придется сделать то же самое   -  person Josmoor98    schedule 06.12.2019


Ответы (9)


Пробовал добавить в свой launch.json, потом работает!

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

ниже мой launch.json

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

Желаю, чтобы это могло помочь вам! :)

person ChenHao Wu    schedule 05.12.2018
comment
Мне также нужно было после этого перезапустить VS Code. - person karu; 07.08.2020
comment
Где найти launch.json? - person James Huang; 24.11.2020
comment
@JamesHuang, нажмите ctrl + shift + p и введите launch.json, а затем нажмите Enter. - person Yuvraj Singh Jadon; 04.02.2021
comment
@JamesHuang Конфигурации определены в launch.json файле, который хранится в .vscode папке в вашем рабочем пространстве. Если он не существует, его можно инициализировать с помощью меню отладки на боковой панели.. - person bwdm; 08.03.2021
comment
launch.json больше не встречается в последней версии vscode. - person John Jiang; 01.04.2021
comment
@JohnJiang Если нет каталога .vscode, вы можете просто создать его (в каталоге проекта). Затем вы можете создать там launch.json. - person Raid; 29.06.2021

Решение, приведенное ниже, сработало для меня.

  1. Нажмите Ctrl+Shift+P
  2. Тип: Configure Language Specific Setting
  3. Затем выберите Python
  4. settings.json откроется. Проверьте этот файл JSON, есть ли там такая строка:
{"python.jediEnabled": false}

(Нажмите Ctrl + F, а затем вставьте указанную выше строку, чтобы быстро ее найти)

  1. Если да, то удалите или закомментируйте эту строку, сохраните файл и перезагрузите VScode.
  2. СДЕЛАНО!
person Mubashar javed    schedule 28.09.2019
comment
Если твоя боль похожа на мою - что python.jedi делает? См. это - person Timo; 02.07.2021

В файле launch.json измените env:{} на:

"env": {"PYTHONPATH": "${workspaceRoot}"}
person G4th    schedule 03.04.2018
comment
где находится launch.json? - person Antonio Sesto; 01.05.2021
comment
Это тоже помогло мне, спасибо. После выходных он начал неожиданно выходить из строя. Я думаю, обновление VS - person Juan; 10.05.2021

В моем случае это не имеет отношения к

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

Вот моя структура папок / модулей:

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

а в test.py он импортирует функцию utils

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

Нет проблем, если я запустил test.py в папке терминала / Dev / csproj / deploy /.
Но если я хочу отлаживать test.py в VSCode (в workspaceRoot), я получил исключение «ModuleNotFoundError»
Чтобы исправить это, я добавляю это в свою конфигурацию отладки launch.json

"cwd": "${workspaceRoot}\\Dev\\csproj\\deploy",
person Dylan Wang    schedule 18.03.2019

Спасибо Honza Kalfus jankalfus

Я заметил, что если я использую File -> Close folder, а затем File -> Open Folder ... и снова открываю папку проекта, ошибки исчезают. Если я просто перезапущу VS Code, я продолжаю получать ошибки. Я предполагаю, что очищается какой-то внутренний кеш?

Найдено здесь https://github.com/Microsoft/vscode/issues/10391

person dcarl661    schedule 03.04.2019

я ничего не сделал, кроме как добавить заголовок в начале

#!/usr/bin/env python

это устранило мою проблему ... может быть, это поможет кому-то новичку, как и я

person LongToeBoy    schedule 12.04.2020

У меня была такая же проблема, в моем случае она была вызвана тем, что текущий каталог процесса отладки vscode отличался от каталога, в котором находился скрипт. Полезно сделать

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

Незадолго до вашего sys.path.append и вашего импорта. Что случилось со мной, так это то, что рабочая среда cwd, по-видимому, по умолчанию используется в каталоге рабочей области, который, по-видимому, является каталогом, содержащим файл проекта vs code, и если это не то место, где находится ваш скрипт, то ваши относительные пути включения нарушены.

Решением этой проблемы является обеспечение того, чтобы ваш скрипт изменил свой текущий каталог на каталог, в котором он находится, а также добавить ваш системный путь к каталогу, в котором расположен скрипт:

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()))

Все вышеперечисленные шаги помогут правильно запустить ваш скрипт, но не помогут для intellisense или автозавершения кода. Чтобы завершение кода работало хорошо, вы должны создать файл .env (обычно в том же каталоге, что и ваш каталог .vscode), а в вашем файле .env вы добавите каталоги, в которых вы хотите, чтобы vscode искал дополнительные модули python

Содержимое файла .env

PYTHONPATH="someDirRelativeTowhereYourVSCodeProjectLives\\Autogen"
person Paulus    schedule 14.04.2020
comment
Ради интереса, почему голос против? Я пытался правильно ответить и указать на то, что могло вызвать проблему? - person Paulus; 21.04.2020

Поскольку это вопрос VScode, я могу добавить свой ответ.

Мы запускаем многие бэкэнды Python Django в папке бэкэндов, например:

+projectBackends
    -oneService
    -twoService
    -threeService

Итак, в моей папке проекта в VScode я просто открыл папку projectBackends, потому что тогда я получил бы сразу все службы, находящиеся под ней. Казалось понятным и простым. Но тогда весь линтинг выполняется из корневой папки, которой является projectBackends, а не из корневой папки каждой службы:

from oneService.module1 import view

выдал и ошибку импорта, где если я поставлю

from projectBackends.oneService.module1 import view

У меня не было ошибки, но тогда микросервис не работал.

Итак, в конце я просто добавил папку для каждого микросервиса в моем рабочем пространстве, например:

+oneService
+twoService
+threeService

Что решило все ошибки импорта для независимых микросервисов.

person Alfa Bravo    schedule 06.08.2020

Есть два пути. Непосредственно поместите его в launch.json или используйте .env файл.

Все в launch.json

launch.json

"env": {"PYTHONPATH": "${workspaceRoot};${workspaceRoot}/modules;${workspaceRoot}/modules/somePrj/modules"}

Используйте .env файл

launch.json

"envFile": "${workspaceRoot}/.env"

.env

PYTHONPATH=".;modules;/modules/somePrj/modules"

Рекомендуется использовать путь .env, поскольку мы можем выбрать prod.env или test.env.

person W.Perrin    schedule 16.08.2020