【问题标题】:VS Code task and Python virtual environmentVS Code 任务和 Python 虚拟环境
【发布时间】:2018-08-20 14:59:07
【问题描述】:

我在工作区设置中声明了一个 python 虚拟环境,一切都很好。

现在我有一个调用 make 目标的构建任务,该目标又调用 pip 包。当我运行它时,它不使用我的venv,即使它是选定的解释器。

我尝试在调用make 命令之前添加activate venv/...,但在嵌入式终端中出现Permission denied 错误。

如何同时使用虚拟环境和任务?

【问题讨论】:

  • 将python绝对路径放入你的任务中。例如:“命令”:“~/.pyenvs/myenv/bin/python myscript.py”
  • 这是一个很好的观点,但我应该更清楚地说明我正在调用一个调用我的 python 脚本的make target。我现在将编辑我的消息。有什么想法吗?

标签: python visual-studio-code


【解决方案1】:

我使用以下 tasks.json 进行了测试,并且可以正常工作:

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

先激活虚拟环境,再执行make。

【讨论】:

  • 我正在用source... & make 而不是&& 做类似的事情......错别字,错别字,错别字。我猜; 限制了潜在的拼写错误:) 谢谢。
【解决方案2】:

回答您的问题可能有点晚了,但诀窍是将命令字段设置为指向 虚拟环境的 python 可执行文件,而不是默认的 python。如果您正确设置了.vscodesettings.json,您的文件中应该有这样的内容:

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

在您的工作区中拥有此配置后,您可以使用${config:python.pythonPath} 创建类型为process 的自定义任务,因为它是command 字段。

您可以在 VSCode 文档的 this section 中阅读所有相关信息。


这个例子创建了一个 Django python manage.py migrate 任务:

{
    "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": []
        }
    ]
}

【讨论】:

  • 这是一个更好的答案,因为当前 python.PythonPath 的插值。使用此解决方案,如果该路径发生更改,您将不必升级您的任务。坦率地说,我认为 VSCode 中的一个明显的功能遗漏是您无法以某种方式指定“python”类型的任务,该任务默认使用您选择的 Python 解释器来运行命令。这种设计表明构建任务命令只能全局安装,而不是每个项目安装。
  • 我需要运行这个确切的migrate 命令。但它仍然在 Anaconda 环境中失败。所以我写了一个更复杂的命令,它在运行 Python 脚本之前激活环境:${config:python.pythonPath}\\..\\..\\..\\Scripts\\activate ${config:python.pythonPath}\\.. && python manage.py migrate --noinput
  • 这个答案是错误的,会导致奇怪的错误,可以在这里阅读stackoverflow.com/a/70151208/5395110。它省略了在大多数情况下都可以工作的激活,但在基本上不可能调试边缘情况时会失败。
【解决方案3】:

我迟到了,但这个替代方案可能有用。如果你使用 pipenv 代替标准 venv,你可以使用pipenv run。它将在运行进程之前激活 virtualenv。例如,这适用于构建 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"
            }
        }
    ]
}

【讨论】:

  • 这实际上是我在发布后不久就完成的,谢谢分享!我建议使用 poetry 而不是 pipenv。
【解决方案4】:

您可以修改tasks.json 中的shell,使其适用于bashcmd shell。这对我有用,它可以正确打印虚拟环境中 python 可执行文件的完整路径。

{
    "version": "2.0.0",
    "linux": {
        "options": {
            "shell": {
                "executable": "bash",
                "args": [
                    "--init-file",
                    "env/bin/activate",
                    "-ci",
                ]
            }
        },
    },
    "windows": {
        "options": {
            "shell": {
                "executable": "cmd.exe",
                "args": [
                    "/C",
                    "env\\Scripts\\activate.bat",
                    "&"
                ]
            }
        }
    },
    "tasks": [
        {
            "label": "test shell with virtualenv",
            "command": "which python", // where on Windows for testing
            "type": "shell",
            "group": "build",
            "problemMatcher": []
        }
    ]
}

【讨论】:

  • 这个答案是迄今为止最好的答案。我看到的唯一改进是将shell args 中的env 路径替换为${config:python.pythonPath}/../activate 和相应的Windows 对应项。这使得它符合 VSCode 中选择的 venv(除非您选择了没有激活脚本的系统解释器)
【解决方案5】:

对于可能使用诗歌的人来说,解决方案是运行

诗贝

在运行 VSCode 之前,更好的解决方案是执行以下操作。这已在较早的答案中提到过,但并非专门针对诗歌。

Use Poetry for Python Dependency

【讨论】:

    【解决方案6】:

    我自己最近在这方面遇到了很多麻烦。我想在运行代码之前更新包要求,但我不想实现复杂或需要大量维护的解决方案。以下对我来说适用于 Windows、OSX 和 Linux 环境。

    {
      "version": "2.0.0",
      "tasks": [
        {
          "label": "pipInstall",
          "type": "shell",
          "command": "${command:python.interpreterPath}",
          "args": ["-m", "pip", "install", "-r", "requirements.txt"]
        }
      ]
    }
    

    我相信${command:python.interpreterPath} 指向在设置环境时选择的任何解释器路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      • 2019-11-25
      • 2021-06-23
      相关资源
      最近更新 更多