【问题标题】:How to correctly set PYTHONPATH for Visual Studio Code如何为 Visual Studio Code 正确设置 PYTHONPATH
【发布时间】:2019-05-08 05:58:51
【问题描述】:

如何在 VisualStudio Code 中为我的工作区正确设置 $PYTHONPATH 变量?

背景信息

我已经安装了两个版本的 GNURadio:

  1. Linux Mint 包管理器在/usr/lib/python2.7/dist-packages/gnuradio 中安装的GNURadio 3.7.11 版

  2. 由 PyBOMBS 在/home/tejul/Documents/gr13/default/lib/python2.7/dist-packages/gnuradio 安装的GNURadio 3.7.13.4 版(我的前缀目录是~/Documents/gr13/default

只有在运行setup_env.sh 脚本(其中包括将/home/tejul/Documents/gr13/default/lib/python2.7/dist-packages 添加到$PYTHONPATH)然后在终端中启动python 之后,我才能使用较新版本的GNURadio 版本

tejul@Wacom:~/Documents/gr13/default$ ls
bin  etc  include  lib  libexec  setup_env.sh  share  src
tejul@Wacom:~/Documents/gr13/default$ source ./setup_env.sh 
tejul@Wacom:~/Documents/gr13/default$ python
Python 2.7.15rc1 (default, Nov 12 2018, 14:31:15) 
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from gnuradio import gr
>>> gr.version()
'3.7.13.4'
>>> 

不修改 $PYTHONPATH python - 自然地 - 导入旧版本的 GNURadio。

我想在 VisualStudio 代码中为新版本的 GNURadio 编写、运行和调试 python 脚本。我一直在尝试了解 VSCode 对 python interpretersworkspacesenvironments 的选择。

据我了解,VSCode 工作区设置python.pythonPath 不应与环境变量$PYTHONPATH 混淆。 python.pythonPath 是用于调试或运行代码的python 解释器 的路径,而$PYTHONPATH 是python 用于搜索模块 的环境变量。

看起来 PyBOMBS 没有将自己的 python 解释器安装到我的前缀目录中。所以我需要将 VSCode 与位于/usr/bin/python2.7 的普通 python 解释器一起使用。所以重新定义 VSCode 的 python.pythonPath 或选择另一个 python 解释器对我没有帮助。

我需要让 VSCode 使用我自己版本的环境变量 $PYTHONPATH,它会告诉我的常规 python 解释器最好从 /home/tejul/Documents/gr13/default/lib/python2.7/dist-packages 导入模块。

问题

documentation 之后,我在工作区目录中创建了自己的.env 文件,该文件设置了python 应该从中导入模块的位置的优先顺序。唉,对python解释器没有影响。

你能看出我在这里做错了什么吗?我也试过:

  • 将 PYTHONPATH 设置为更高一级的文件夹,即/home/tejul/Documents/gr13/default/lib/python2.7,这没有帮助
  • 调用变量$PYTHONPATH 而不是PYTHONPATH,这没有帮助
  • 每次更改 .env 文件后重新启动 VSCode,这没有帮助
  • 在路径字符串周围使用双引号,例如PYTHONPATH="/home/tejul/Documents/gr13/default/lib/python2.7:/usr/lib/python2.7",这没有帮助

【问题讨论】:

  • 我没有设法在 Visual Studio Code 中设置 PYTHONPATH,但我找到了如何让 VSCode 从系统环境变量中继承它。我已将这两行添加到我的 .bashrc 文件中:# setup python gnuradio environment source /home/tejul/Documents/gr13/default/setup_env.sh 自动为每个终端窗口运行 setup_env.sh 脚本。

标签: visual-studio-code pythonpath gnuradio


【解决方案1】:

使用 VS Code,一个 pip 虚拟环境,可以放在.venv/bin/activate 文件的末尾:

export PYTHONPATH="${PYTHONPATH}:/path/to/your/package"

package -> module1 -> abc.py 你可以使用:import module.abc etc.

【讨论】:

    【解决方案2】:

    在 Windows 10 上运行带有 Python 扩展 v2021.10.1365161279 的 VSCode 1.6.2。

    调试工作基于env文件,我使用默认文件.env:
    PYTHONPATH=<full_path_to_the_workspace_folder>

    运行基于.vscode/settings.json文件的工作
    "terminal.integrated.env.windows": {"PYTHONPATH": "<full_path_to_the_workspace_folder>"}
    只是我发现如果我更改了路径,我需要禁用+重新加载+启用扩展。

    【讨论】:

      【解决方案3】:

      我也有类似的问题,我在远程服务器上通过 ssh 使用 vs-code,服务器有多个用户帐户,所以典型的 ubuntu python 路径对我不起作用。

      我发现进行调试的最简单方法是首先使用“which python”找到我自己的 python 安装位置。输出类似于“/home/user_name/anaconda3/bin/python”。

      然后在 vs-code 中,我手动将 python 解释器位置设置为上述位置。我通过单击 vs 代码底部的 python 选项卡来做到这一点。 like the Python 3.8.5 64-bit in this picture. 这将打开命令面板,询问 python 解释器的位置,如图所示。 manually put the location of python install here. 完成所有这些步骤后,我的python调试工作顺利。

      【讨论】:

      • 我遇到了“从熊猫导入 Excelwriter”的问题。它抛出一个错误“ModuleNotFoundError:没有名为'pandas'的模型。我遵循完全相同的方式。在终端运行“哪个python”。它返回绝对路径。然后将此路径添加到python解释器的位置。这解决了我的问题。非常感谢@SIDHARTH Kumar
      【解决方案4】:

      在你的 vs 代码工作区文件夹中编辑 settings.json

      {
      "python.pythonPath": "*python package path*",
      "terminal.integrated.env.windows": {
          "PYTHONPATH": "${workspaceFolder}/*sub folder*;*python package path*"
      },
      "python.defaultInterpreterPath": "*path to python exe*",
      "python.analysis.extraPaths": [
          "*python package path*",
          "*python package path*"
      ],
      "python.autoComplete.extraPaths": [
          "*python package path*",
          "*python package path*"
      ]}
      

      效果很好!

      【讨论】:

      • 您能提供更多信息吗?这段代码有什么作用?
      【解决方案5】:

      我有一种我认为比较常见的情况。我想要一个脚本来从另一个目录导入模块。我的python项目布局如下:

      ~/project/
        |
        |---modules/
              |
              |---mod.py
        |---scripts/
              |---script.py
      

      script.py,我有from modules import mod。所以我的PYTHONPATH 需要设置为~/project/(PyCharm 自动执行的操作)。

      VSCode 是一个很棒的编辑器,但在我看来,它在其他任何地方都不尽如人意。这是一个很好的例子。

      我创建了一个默认的launch.json 文件来“运行当前文件”。必须添加 "cwd": "${fileDirname}" 行,以使事情像在 PyCharm 中一样工作(仅供参考,可以找到内置变量的列表 here)。

      调试

      对于调试(侧边栏上的“播放”按钮,或 F5 键),launch.json 或您的.env 文件中设置的PYTHONPATH 生效。请注意,在.env 文件中,您不能使用诸如${workspaceRoot} 之类的变量,但您可以使用适合您平台的分隔符轻松附加或插入路径(; 用于 Windows,: 用于其他所有人)。

      因为我想利用这个变量,所以我把它放在我的launch.json

          "env": {"PYTHONPATH": "${workspaceFolder}${pathSeparator}${env:PYTHONPATH}"}
      

      (感谢@someonr 建议使用${pathSeparator}。)

      您似乎可以在从环境继承的任何内容之前添加/附加(settings.json 并非如此;见下文)。

      这也适用于热键 Ctrl+F5(无需调试即可运行)。

      作为参考,这里是完整的文件,它复制了 PyCharm 自动执行的操作:

      {
          "version": "0.2.0",
          "configurations": [
              {
                  "name": "Python: Current File",
                  "type": "python",
                  "request": "launch",
                  "program": "${file}",
                  "console": "integratedTerminal",
                  "cwd": "${fileDirname}",
                  "env": {"PYTHONPATH": "${workspaceFolder}${pathSeparator}${env:PYTHONPATH}"}
              }
          ]
      }
      

      在终端运行

      如果我点击编辑器窗口右上角的“播放”按钮(当 python 文件是活动选项卡时),它将不起作用。这将在终端中运行当前文件,它根本不关注launch.json。要实现这一点,您必须在 settings.json 文件中定义 PYTHONPATH,并添加以下内容:

          "terminal.integrated.env.osx": {"PYTHONPATH": "${workspaceFolder}"}
      

      (请注意,每个平台都有不同的值。)如果您选择了 python 解释器(例如,从虚拟环境中),您将在 .vscode 目录中拥有一个 settings.json 文件。我的看起来像这样:

      {
          "python.pythonPath": "/Users/me/project/venv/bin/python3",
          "terminal.integrated.env.osx": {"PYTHONPATH": "${workspaceFolder}"}
      }
      

      您不能通过settings.json 文件将值附加或插入到继承的PYTHONPATH 中。它只需要一个字符串,并且不会解析分隔符。因此,即使您可以使用 ${env:PYTHONPATH} 获取值,您也无法使用它做任何事情。

      此外,您不能设置当前工作目录。即使您似乎可以使用"terminal.integrated.cwd": "${workspaceFolder}" 设置它,但它不起作用。因此,如果您的任何脚本对相对于它们在树中位置的路径执行任何操作,它们将不起作用。工作目录将是您的项目根目录。

      请注意,对 settings.json 文件的任何更改都需要您退出集成终端并重新启动它。

      起绒

      我对@9​​87654355@ 所做的关于PYTHONPATH 的操作对pylint 没有任何影响,这将在from modules import mod 上加上红色下划线,尽管事实上我可以将光标放在mod 上,按F12,然后文件打开。窥探 linting 设置,mypy 的默认值包括 --ignore-missing-imports。要使用 pylint 复制此行为,请将其添加到您的 settings.json

          "python.linting.pylintArgs": [
              "--disable=F0401"
          ] 
      

      很遗憾我们不得不解决这个问题,但是在编写导入语句开始时,自动完成功能很有帮助。

      结论

      VSCode 有很多层,很难让事情协同工作。似乎有多种环境在四处飘荡。最后:

      1. 我无法“在终端中运行”,因为我无法将当前工作目录设置为包含当前文件的路径。
      2. 我无法为pylint 设置PYTHONPATH,因为它运行在与集成终端不同的环境中以及由launch.json 控制的任何环境中,所以我只能告诉pylint 忽略导入错误。
      3. 如果您通过.env 文件或launch.json 设置PYTHONPATH,则使用F5 运行有效

      【讨论】:

      • 在花了一天的大部分时间试图让 linting 在Multi-Root Workspace 中工作之后,我发现对于“python.envFile”设置,在工作区配置文件中设置它(即@ 987654371@ 文件)不起作用,但在scripts/.vscode/settings.json 中设置它(使用您的示例)可以解决问题。您需要注意 ${workspaceFolder} 将相对于 scripts 文件夹。无论如何,我认为这就是正在发生的事情......它目前正在为我工​​作。
      • 另外,我现在注意到.env 文件中的PYTHONPATH 必须是绝对路径(或者可能相对于某些东西,但我不确定是什么)。
      • 非常感谢您。我可以调试但不明白为什么从终端运行给我ModuleNotFoundError。您对 VScode 如何/何时能够在这些设置中正常运行有任何线索吗?
      • 我已将 PYTHONPATH 设置为具有多个目录。为此,我认为我不能将光标放在我的导入上,也不能遵循它们的定义。
      • @someonr ${pathSeparator} 不是 :;${pathSeparator}/ 对于 Linux/Mac 或 \ 对于 Windows (source)。不幸的是,VS Code 没有:; 的变量,所以.env PYTHONPATH= 不能跨平台,如果它有多个条目。这就是为什么我使用 pylint 的 --init-hook 来代替 sys.path
      【解决方案6】:

      对于 Pyright 等工具,您可以在工作区 settings.json 中编辑 python.analysis.extraPaths

      例子:

      {
          ...
          "python.analysis.extraPaths": [
              "src/apps",
              "src/override_apps"
          ],
          ...
          // next lines can be different
          "python.linting.enabled": true, 
          "python.linting.pylintEnabled": true,
          "python.linting.mypyEnabled": false,
          "python.pythonPath": "environment/bin/python",
          ...
      }
      

      【讨论】:

        【解决方案7】:

        我花了很长时间弄清楚的另外两个问题(尽管上面的答案很好)可能对其他人有所帮助:

        1. 确保您已将 VS Code 配置为允许终端 配置来修改你的 shell 设置(通过管理工作区 Shell 权限(请参阅 https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration)。否则 VS Code 会默默地忽略你的 terminal.integrated.env.{platform} 设置。
        2. 如果启动它的模块位于一个包文件夹中(即有 _init_.py 文件),Pylint 只会在 worspace 目录中搜索其他模块(参见 @ 987654322@) 意味着即使代码运行正常,由于如上配置的 VS Code launch.json,pylint 仍将继续突出显示导入错误。

        【讨论】:

          【解决方案8】:

          Linux 用户在这里。我无法让它工作,并且与其他 vscode Python 扩展设置有很多交互,但以下对我有用:

          • 关闭所有工作区。

          • 添加一个您希望作为新工作区根文件夹的文件夹。

          • 将包含PYTHONPATH=/path/to/a:/path/to/b 的 .env 文件单独放在一行中。不要在值周围使用双引号。

          • 重启 vscode

          • 创建一个 test.py 脚本,用于在您的文件夹中导入包或模块

          • vscode 应该允许您的 import 语句,并且应该自动完成您文件夹中的代码。

          【讨论】:

            【解决方案9】:

            这个问题值得一票,因为文档缺少一些重要的细节。

            示例

            假设你的项目布局是这样的

            myproject/
                .vscode/
                    settings.json
                .env
                src/
                    a_module.py
                tests/
                    test_a.py
            

            打开 settings.json 文件并插入这些行

            "terminal.integrated.env.windows": {
                "PYTHONPATH": "${workspaceFolder}/src;${workspaceFolder}/tests"
            },
            "python.envFile": "${workspaceFolder}/.env",
            

            请注意,${workspaceFolder} 的计算结果为 myproject,而不是 .vscode 文件夹。

            在 .env 文件中输入这个

            WORKSPACE_FOLDER=C:/full/path/to/myproject
            PYTHONPATH=${WORKSPACE_FOLDER}/src;${WORKSPACE_FOLDER}/tests
            

            请注意,在 Windows 上,路径中的斜线会向前倾斜,例如 /。不同的路径用; 分隔(在其他平台上用:)。

            This blog 很有帮助。

            【讨论】:

            • 这对我来说可以在打开 VSCode 之前将 PYTHONHASHSEED 设置为固定值。我像您描述的那样将"python.envFile": "${workspaceFolder}/.env" 放在settings.json 文件中,然后简单地将PYTHONHASHSEED="0" 添加到.env 文件中。谢谢!很长时间以来,我一直在努力解决这个问题。
            • 我以为 vscode .env 文件不会像${WORKSPACE_FOLDER} 那样做变量扩展? "Variable substitution is only supported in VS Code settings files, it will not work in .env environment files."
            • 在同一页面上它说:“值可以引用系统中或文件中更早定义的任何其他环境变量”,这就是我们在这里所做的。文档似乎自相矛盾。
            【解决方案10】:

            OP 似乎询问了 .env 文件的路径语法和 vscode 设置,以便它找到并读取一些自定义模块文件。我的问题很相似,因为我希望代码能够在脚本中找到要导入的自定义模块。我不想将自定义模块放在 python 环境中的文件夹中。我还想避免为 Windows 环境变量中的用户变量设置一个或多个路径作为 PYTHONPATH - 但如果你想这样做,这将起作用。 我在 Windows 10 中使用 vscode。

            1) 语法:

            a) 我发现以下路径语法在 env 文件中有效:

            PYTHONPATH = C:/0APPS/PYTHON/_MODULES

            我的 .py 模块文件在这个文件夹中。

            b) # 适用于 .env 文件中的 cmets。

            2) VSCODE SET-UP:我发现以下工作:

            a) 就像sunew 在#2 我的设置中所说的那样:使用 vscode 中的资源管理器在您选择的项目工作区文件夹中打开。对我来说就是 Q:\420 PYTHON

            b) 为 env 文件命名,例如 vscode.env 文件,并将其放在工作区顶层的文件夹中。

            c) 打开 vscode 设置并搜索 .env,在 Extensions > Python 下,您会找到“Python: env 文件”。编辑框以在 .env 之前添加您的 env 文件名。 例如${workspaceFolder}/vscode.env

            d) import custom_modulename 现在对我有用 - 在 python 交互式窗口和脚本中。

            【讨论】:

              【解决方案11】:

              在 .env 中设置 PYTHONPATH 对我有用。 请注意,效果仅适用于 vscode 及其运行的工具,例如 pylint。

              我的情况: 我有一个不是 pip 可安装包的项目,而只是一个源文件夹。 (出于历史原因...)

              myproject/src

              项目在 pip requires 文件中定义了依赖项。

              我的设置:

              1. 我创建了一个 virtualenv,并从所需文件安装包。
              2. 我在文件夹 myproject 中打开 vscode - 所以这成为 vscode“项目”的根目录。
              3. 我指出 vscode 使用 virtualenv 作为 python 解释器。这将使使用 pip 安装的依赖项的导入工作。 (对于 linter、intellisense 等)
              4. 为了让我的项目源代码导入也适用于 vscode 中的 linter(尤其是 pylint),我添加了一个包含此内容的 .env,将我的项目源文件夹添加到 PYTHONPATH:
              PYTHONPATH=./src:${PYTHONPATH}
              

              【讨论】:

              • 请注意:在 Windows 上,您必须使用分号 ';'作为分隔符! env 文件中的 PYTHONPATH 定义不是独立于平台的:code.visualstudio.com/docs/python/… 我自己花了很长时间才弄清楚这一点......
              猜你喜欢
              • 2019-07-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-09-17
              • 2021-07-09
              • 2016-07-06
              • 2017-05-25
              • 2021-06-04
              相关资源
              最近更新 更多