如何为Visual Studio代码正确设置PYTHONPATH

时间:2018-12-06 14:00:33

标签: visual-studio-code pythonpath gnuradio

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

背景信息

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

    Linux Mint软件包管理器在/usr/lib/python2.7/dist-packages/gnuradio

    中安装的
  1. 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 Code中为新版本的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解释器没有影响。

Showing that VSCode is ignoring my $PYTHONPATH setting

您能看到我在做什么错吗?我也尝试过:

  • 将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",这没有帮助

9 个答案:

答案 0 :(得分:31)

我有一种情况,我认为是相对普遍的。我希望脚本从另一个目录导入模块。我的python项目的布局如下:

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

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

VSCode是一个很棒的编辑器,但是在我看来,它在其他地方都达不到。这是一个完美的例子。

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

调试

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

因为我想利用该变量,所以将其放在我的launch.json中:

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

看来您可以在环境中继承/添加任何内容(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}:${env:PYTHONPATH}"}
        }
    ]
}

在终端中运行

如果我点击了显示在编辑器窗口右上角的“播放”按钮(当python文件为活动标签时),它将无法使用。这将在终端中运行当前文件,而根本不注意launch.json。为此,您必须通过添加以下内容在PYTHONPATH文件中定义settings.json

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

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

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

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

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

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

棉绒

对于launch.json,我对PYTHONPATH所做的任何操作都与pylint没有任何区别,尽管我可以将光标放在{{ 1}},然后按F12键,文件将打开。窥探棉绒设置,from modules import mod的默认值包括mod。要使用pylint复制此行为,请将其添加到您的mypy

--ignore-missing-imports

很遗憾,我们只需要解决此问题,但是在编写导入语句开始时,自动完成功能会很有帮助。

结论

VSCode有很多层次,很难使所有东西协同工作。似乎有多种环境在浮动。最后:

  1. 我无法“在终端中运行”,因为我无法将当前工作目录设置为包含当前文件的路径。
  2. 我无法为settings.json设置 "python.linting.pylintArgs": [ "--disable=F0401" ] ,因为它在与集成终端不同的环境中运行,并且不受PYTHONPATH的控制,因此我只能告诉pylint忽略导入错误。
  3. 如果您通过launch.json文件或在pylint中设置PYTHONPATH,则可以使用F5运行

答案 1 :(得分:4)

对于像 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",
    ...
}

答案 2 :(得分:3)

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

示例

假设您的项目布局是这样

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上,路径中的斜杠向前倾斜,例如/。不同路径用;分隔(在其他平台上则用:)。

2 step process很有帮助。

答案 3 :(得分:2)

OP似乎询问了.env文件的路径语法和设置的vscode,以便它查找和读取一些自定义模块文件。我的问题类似,因为我想让代码找到要在脚本中导入的自定义模块。我不想将自定义模块放在python环境中的文件夹中。我还想避免在Windows环境变量中将一个或多个路径设置为用户变量的PYTHONPATH-但这可以工作。 我正在Windows 10中的vscode中工作。

1)语法:

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

PYTHONPATH = C:/ 0APPS / PYTHON / _MODULES

我的.py模块文件位于此文件夹中。

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

2)VSCODE设置:我发现以下工作有效:

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

b)给env文件起一个名称,例如vscode.env文件,并将其放在工作区顶层的该文件夹中。

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

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

答案 4 :(得分:1)

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

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

myproject/src

该项目具有在pip需求文件中定义的依赖项。

我的设置:

  1. 我创建一个virtualenv,然后从require文件安装软件包。
  2. 我在文件夹myproject中打开vscode-因此它成为vscode“项目”的根。
  3. 我将vscode指向使用virtualenv作为python解释器。这将使通过pip安装的依赖项导入工作。 (用于短毛绒,智能感知等)
  4. 要使从项目源中导入的文件也能处理vscode中的短毛绒(尤其是毛毡),我添加了一个包含此内容的.env,并将我的项目源文件夹添加到PYTHONPATH中:
PYTHONPATH=./src:${PYTHONPATH}

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

在你的 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*"
]}

效果很好!

答案 7 :(得分:1)

我也有一个类似的问题,我通过 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调试工作顺利。

答案 8 :(得分:0)

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

  • 关闭所有工作区。

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

  • 将包含PYTHONPATH=/path/to/a:/path/to/b的.env文件放在一行上。请勿在值周围使用双引号。

  • 重新启动vscode

  • 创建一个test.py脚本,将其导入文件夹中的包或模块

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