VS Code task and Python virtual environment

2020-04-08 14:00发布

I have a python virtual environment declared in my workspace settings, everything is fine with it.

Now I have a build task that calls a make target which in turn calls a pip package. When I run it, it doesn't use my venv even though it is the selected interpreter.

I've tried to add a activate venv/... before calling my make command but I get a Permission denied error in the embedded terminal.

How can I use a virtual environment and tasks at the same time?

3条回答
相关推荐>>
2楼-- · 2020-04-08 14:22

It might be a little late to answer your question but the trick is to set the command field to point to the virtual environment's python executable instead of the default python. If you set up your .vscode's settings.json correctly you should have something like this in your file:

{
    "python.pythonPath": "env\\Scripts\\python.exe",
    // other settings ...
}

Having this config in your workspace, you can then create a custom task of type process using ${config:python.pythonPath} as it's command field.

You can read all about it in this section of VSCode's docs.


This example creates a Django python manage.py migrate task:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Migrate",
            "type": "process",
            "command": "${config:python.pythonPath}",
            "args": [
                "${workspaceFolder}/src/manage.py",
                "migrate"
            ],
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": false,
                "panel": "shared",
                "showReuseMessage": true,
                "clear": true
            },
            "problemMatcher": []
        }
    ]
}
查看更多
萌系小妹纸
3楼-- · 2020-04-08 14:23

I'm late to the party, but this alternative might be useful. If you use pipenv in stead of standard venv, you can use pipenv run. It will activate the virtualenv before running the process. For example, this works for building sphinx:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build html",
            "type": "process",
            "command": "pipenv",
            "args": [
                "run", 
                "sphinx-build", 
                "-b", 
                "html", 
                "${workspaceFolder}", 
                "${workspaceFolder}/_build/html"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "reveal": "always",
                "panel": "new"
            }
        }
    ]
}
查看更多
手持菜刀,她持情操
4楼-- · 2020-04-08 14:26

I tested with the following tasks.json and it works:

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "test",
      "type": "shell",
      "command": "source /home/me/.pyenvs/myenv/bin/activate; make"
    }
  ]
}

First activate virtual environment and then executes make.

查看更多
登录 后发表回答