VScode 在 Python 虚拟环境 virtualenv 中无法正常使用调试功能

最近安装了 vscode 想要学习一下怎么用它来编写 Python ,结果今天遇到问题了。在 virtualenv 环境中启动vscode 却没办法正常调试。

基本环境

系统: manjaro Linux 17.0.2
python: python 3.6.2
vscode: 1.16.0
--扩展: donjayamanne.python 0.7.0

症状描述

使用终端进入虚拟环境后启动vscode 或 设置中指定解释器位置"python.pythonPath": "虚拟目录/bin/python"。任意一种方式启动vscode(最后的症状都一样)。

点击 F5 之后虽然调试用的工具条会出现,但是代码却被直接执行了,和直接运行代码的效果一样,而工具条除了停止以外,其他功能都没反应。

求解决办法,还是说都这样?这不科学啊!

配置文件包括:

# setting.json 

{

"files.autoSave": "afterDelay",

"python.pythonPath": "~/pyStudy/venv/bin/python",

}

# launch.json 这个应该是自动生成的没动过

{

// 使用 IntelliSense 了解相关属性。

// 悬停以查看现有属性的描述。

// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387

"version": "0.2.0",

"configurations": [

{

"name": "Python",

"type": "python",

"request": "launch",

"stopOnEntry": true,

"pythonPath": "${config:python.pythonPath}",

"program": "${file}",

"cwd": "${workspaceRoot}",

"env": {},

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

"debugOptions": [

"WaitOnAbnormalExit",

"WaitOnNormalExit",

"RedirectOutput"

]

},

{

"name": "PySpark",

"type": "python",

"request": "launch",

"stopOnEntry": true,

"osx": {

"pythonPath": "${env:SPARK_HOME}/bin/spark-submit"

},

"windows": {

"pythonPath": "${env:SPARK_HOME}/bin/spark-submit.cmd"

},

"linux": {

"pythonPath": "${env:SPARK_HOME}/bin/spark-submit"

},

"program": "${file}",

"cwd": "${workspaceRoot}",

"env": {},

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

"debugOptions": [

"WaitOnAbnormalExit",

"WaitOnNormalExit",

"RedirectOutput"

]

},

{

"name": "Python Module",

"type": "python",

"request": "launch",

"stopOnEntry": true,

"pythonPath": "${config:python.pythonPath}",

"module": "module.name",

"cwd": "${workspaceRoot}",

"env": {},

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

"debugOptions": [

"WaitOnAbnormalExit",

"WaitOnNormalExit",

"RedirectOutput"

]

},

{

"name": "Integrated Terminal/Console",

"type": "python",

"request": "launch",

"stopOnEntry": true,

"pythonPath": "${config:python.pythonPath}",

"program": "${file}",

"cwd": "",

"console": "integratedTerminal",

"env": {},

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

"debugOptions": [

"WaitOnAbnormalExit",

"WaitOnNormalExit"

]

},

{

"name": "External Terminal/Console",

"type": "python",

"request": "launch",

"stopOnEntry": true,

"pythonPath": "${config:python.pythonPath}",

"program": "${file}",

"cwd": "",

"console": "externalTerminal",

"env": {},

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

"debugOptions": [

"WaitOnAbnormalExit",

"WaitOnNormalExit"

]

},

{

"name": "Django",

"type": "python",

"request": "launch",

"stopOnEntry": true,

"pythonPath": "${config:python.pythonPath}",

"program": "${workspaceRoot}/manage.py",

"cwd": "${workspaceRoot}",

"args": [

"runserver",

"--noreload",

"--nothreading"

],

"env": {},

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

"debugOptions": [

"WaitOnAbnormalExit",

"WaitOnNormalExit",

"RedirectOutput",

"DjangoDebugging"

]

},

{

"name": "Flask",

"type": "python",

"request": "launch",

"stopOnEntry": false,

"pythonPath": "${config:python.pythonPath}",

"program": "fully qualified path fo 'flask' executable. Generally located along with python interpreter",

"cwd": "${workspaceRoot}",

"env": {

"FLASK_APP": "${workspaceRoot}/quickstart/app.py"

},

"args": [

"run",

"--no-debugger",

"--no-reload"

],

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

"debugOptions": [

"WaitOnAbnormalExit",

"WaitOnNormalExit",

"RedirectOutput"

]

},

{

"name": "Flask (old)",

"type": "python",

"request": "launch",

"stopOnEntry": false,

"pythonPath": "${config:python.pythonPath}",

"program": "${workspaceRoot}/run.py",

"cwd": "${workspaceRoot}",

"args": [],

"env": {},

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

"debugOptions": [

"WaitOnAbnormalExit",

"WaitOnNormalExit",

"RedirectOutput"

]

},

{

"name": "Pyramid",

"type": "python",

"request": "launch",

"stopOnEntry": true,

"pythonPath": "${config:python.pythonPath}",

"cwd": "${workspaceRoot}",

"env": {},

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

"args": [

"${workspaceRoot}/development.ini"

],

"debugOptions": [

"WaitOnAbnormalExit",

"WaitOnNormalExit",

"RedirectOutput",

"Pyramid"

]

},

{

"name": "Watson",

"type": "python",

"request": "launch",

"stopOnEntry": true,

"pythonPath": "${config:python.pythonPath}",

"program": "${workspaceRoot}/console.py",

"cwd": "${workspaceRoot}",

"args": [

"dev",

"runserver",

"--noreload=True"

],

"env": {},

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

"debugOptions": [

"WaitOnAbnormalExit",

"WaitOnNormalExit",

"RedirectOutput"

]

},

{

"name": "Attach (Remote Debug)",

"type": "python",

"request": "attach",

"localRoot": "${workspaceRoot}",

"remoteRoot": "${workspaceRoot}",

"port": 3000,

"secret": "my_secret",

"host": "localhost"

}

]

}

更新描述(2017年09月10日)

问题还没有解决,但是感谢 @laxtiz 首先提供的帮助,按照提示。我做了如下操作和尝试,并且发现了一个有趣的事情:

  1. 回复了VScode默认的设置,删除“用户设置”中 Python 的路径。
  2. 在正常环境而非虚拟环境中启动 VScode
  3. 重新创建了两个虚拟环境:
    venv —— 使用Python3 自带的 pyvenv 工具创建:python -m venv venv
    test —— 使用传统的 virtualenv 工具创建:virtualenv test
    本来是想测试是否是创建工具的问题,结果发现了好玩。
  4. 重新设置 VScode 但是使用的是“工作区设置”"python.pythonPath": "/home/gos/pyStudy/venv/bin/python"

图片描述

经过测试发现 VScode 和Python扩展donjayamanne.python 可以正确的识别虚拟环境,并且自动使用pip为虚拟环境安装了 pylint
但是按下F5调试功能后仍然是直接跑代码(之前没有说,这个过程感觉比直接运行脚本要慢)

好玩的是,当我交换两个虚拟环境的Python路径时却可以正常使用调试功能,当然了Python的库也是对方环境中的库


问题已终结

问题以及终结,当时应当是 python 插件的问题,我曾在提问之后在插件作者的 github 中看到同样问题的反馈,目前已经修复了问题。
感谢 @laxtiz@kalotswedish 的热心解答

如还有人与到类似问题请两位的回答

回答:

提示一:不要在code外部加载virtualenv环境
提示二:不要在用户设置中指定python路径

需要在code中使用virtualenv,请在当前工作目录下.vscode/settings.json中指定python.pythonPath
或通过命令面板Python: Select Workspace Interpreter选择。

另外,确保你的虚拟环境完整
可尝试新建文件夹,并新建虚拟环境,分别使用系统python 以及新的虚拟环境启动debug 试试

工作区是指你的项目所在目录,项目在哪你用那个文件夹
虚拟环境的位置无关紧要,只要vscode 能找到就行

补个图
图片描述

回答:

我也遇到了这个问题,解决方法如下,亲测有效。

  1. 确保系统中已经安装好了python、virtualenv、virtualenvwrapper,并且已经创建了虚拟环境。
  2. 打开vs code,按“文件=》首选项=》设置”的顺序进入用户设置,搜索python.venvPath(默认里面为空),将其设置为你的虚拟环境所在的目录。
  3. 按菜单栏“查看=》命令面板”的顺序进入命令面板,输入 Python: Select Workspace Interpreter,选择相应的虚拟目录。

按F5试试看呢,应该已经能在vs code中按虚拟环境的配置进行调试了。

回答:

二楼的方法是对的,亲测有用,非常感谢。有一点要注意的是,用virtualenvwrapper管理虚拟环境,venvPath设成virtualenvwrapper的WORKON_HOME=~/.virtualenvs的这个路径就可以了。注意设定完之后一定要重新启动一下VScode,这样才能在select interpreter里面看到虚拟环境。

以上是 VScode 在 Python 虚拟环境 virtualenv 中无法正常使用调试功能 的全部内容, 来源链接: utcz.com/a/165500.html

回到顶部