如何为Visual Studio Code正确设置PYTHONPATH

Zab*_*aba 9 gnuradio pythonpath visual-studio-code

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

背景资料

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

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

  2. 由PyBOMBS安装的GNURadio版本3.7.13.4 /home/tejul/Documents/gr13/default/lib/python2.7/dist-packages/gnuradio(我的前缀目录是~/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'
>>> 
Run Code Online (Sandbox Code Playgroud)

当然,无需修改$ PYTHONPATH python即可导入较旧的GNURadio版本。

我想在VisualStudio Code中为新版本的GNURadio编写,运行和调试python脚本。我一直在尝试了解VSCode 的python解释器工作区环境的选择。

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

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

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

问题

根据文档,我.env在工作空间目录中创建了自己的文件,该文件设置了python应该从中导入模块的位置的优先顺序。,,它对python解释器没有影响。

显示VSCode忽略了我的$ PYTHONPATH设置

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

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

dar*_*rda 54

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

~/project/
  |
  |---modules/
        |
        |---mod.py
  |---scripts/
        |---script.py
Run Code Online (Sandbox Code Playgroud)

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

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

我创建了一个默认launch.json文件来“运行当前文件”。一个"cwd": "${fileDirname}"行已被添加,使事情的工作,就像他们在PyCharm做(仅供参考,内置变量可以被发现的列表在这里)。

调试

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

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

    "env": {"PYTHONPATH": "${workspaceFolder}${pathSeparator}${env:PYTHONPATH}"}
Run Code Online (Sandbox Code Playgroud)

(感谢@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}"}
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

在终端运行

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

    "terminal.integrated.env.osx": {"PYTHONPATH": "${workspaceFolder}"}
Run Code Online (Sandbox Code Playgroud)

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

{
    "python.pythonPath": "/Users/me/project/venv/bin/python3",
    "terminal.integrated.env.osx": {"PYTHONPATH": "${workspaceFolder}"}
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

棉绒

无论我做launch.jsonPYTHONPATH使得任何区别pylint,这将红色下划线from modules import mod,尽管我可以把光标mod,命中F12,并打开该文件。窥探 linting 设置,mypy包括的默认值--ignore-missing-imports。要使用 pylint 复制此行为,请将其添加到您的settings.json

    "python.linting.pylintArgs": [
        "--disable=F0401"
    ] 
Run Code Online (Sandbox Code Playgroud)

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

结论

VSCode 有很多层,很难让事情一起工作。似乎有多种环境在浮动。到底:

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

  • @someonr `${pathSeparator}` 不是 `:` 或 `;`。`${pathSeparator}` 对于 Linux/Mac 是 `/`,对于 Windows 是 ```\``` ([source](https://code.visualstudio.com/docs/editor/variables-reference#_predefine-variables ))。不幸的是,VS Code 没有 `:` 或 `;` 变量,因此 `.env` `PYTHONPATH=` 如果有多个条目,则不能跨平台。这就是为什么我使用 pylint 的 `--init-hook` 来前置 `sys.path` 。 (6认同)
  • 非常感谢你做的这些。我可以调试,但无法理解为什么从终端运行会给出“ModuleNotFoundError”。您是否知道 VScode 如何/何时能够在这些设置下正常运行? (3认同)
  • 使用 `${pathSeparator}` 而不是 `:` 使其跨平台工作(Windows 使用 `;`)。例如: `"env": {"PYTHONPATH": "${workspaceFolder}${pathSeparator}${env:PYTHONPATH}"}` (2认同)

小智 17

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

1) 语法:

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

PYTHONPATH = C:/0APPS/PYTHON/_MODULES

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

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

2)VSCODE SET-UP:我发现以下方法有效:

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

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

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

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


sun*_*new 14

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

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

myproject/src

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

我的设置:

  1. 我创建了一个 virtualenv,并从 requires 文件中安装了软件包。
  2. 我在文件夹中打开 vscode myproject- 所以这成为 vscode“项目”的根。
  3. 我指出 vscode 使用 virtualenv 作为 python 解释器。这将使使用 pip 安装的依赖项的导入工作。(对于短绒、智能感知等)
  4. 为了也使从我的项目源中的导入为 vscode 中的 linters(尤其是 pylint)工作,我添加了一个包含此内容的 .env,将我的项目源文件夹添加到 PYTHONPATH:
PYTHONPATH=./src:${PYTHONPATH}
Run Code Online (Sandbox Code Playgroud)

  • 请注意:在 Windows 上,您必须使用分号 ';' 作为分隔符!env 文件中的 PYTHONPATH 定义与平台无关:https://code.visualstudio.com/docs/python/environments#_use-of-the-pythonpath-variable 我花了很长时间才以艰难的方式自己弄清楚这一点... (14认同)

Gee*_*ado 11

对于像 Pyright 这样的工具,您可以python.analysis.extraPaths在工作区 settings.json 中进行编辑。

例子:

{
    ...
    "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",
    ...
}
Run Code Online (Sandbox Code Playgroud)


Cod*_*Kid 9

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

例子

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

myproject/
    .vscode/
        settings.json
    .env
    src/
        a_module.py
    tests/
        test_a.py
Run Code Online (Sandbox Code Playgroud)

打开 settings.json fie 并插入这些行

"terminal.integrated.env.windows": {
    "PYTHONPATH": "${workspaceFolder}/src;${workspaceFolder}/tests"
},
"python.envFile": "${workspaceFolder}/.env",
Run Code Online (Sandbox Code Playgroud)

请注意,${workspaceFolder}评估为myproject,而不是.vscode文件夹。

在 .env 文件中输入这个

WORKSPACE_FOLDER=C:/full/path/to/myproject
PYTHONPATH=${WORKSPACE_FOLDER}/src;${WORKSPACE_FOLDER}/tests
Run Code Online (Sandbox Code Playgroud)

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

这个博客很有帮助。


小智 7

编辑 VS Code 工作区文件夹中的 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*"
]}
Run Code Online (Sandbox Code Playgroud)

效果很好!


Cha*_*alk 5

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

  • 关闭所有工作区。

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

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

  • 重启vscode

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

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