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 的热心解答

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

阅读 27.3k
3 个回答

提示一:不要在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里面看到虚拟环境。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏