ChatGPT解决这个技术问题 Extra ChatGPT

如何为 Visual Studio Code 正确设置 PYTHONPATH

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

背景资料

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

GNURadio 版本 3.7.11 由 Linux Mint 包管理器安装在 /usr/lib/python2.7/dist-packages/gnuradio PyBOMBS 安装在 /home/tejul/Documents/gr13/default/lib/python2 中的 GNURadio 版本 3.7.13.4 .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'
>>> 

无需修改 $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 解释器没有影响。

https://i.stack.imgur.com/YQOYS.png

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

将 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 脚本。

d
darda

我有一个我认为比较常见的情况。我想要一个脚本来从另一个目录导入模块。我的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 中设置的 PYTHONPATH 或您的 .env 文件生效。请注意,在 .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 文件的任何更改都需要您退出集成终端并重新启动它。

掉毛

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

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

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

结论

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

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


在花了一天的大部分时间试图让 linting 在 Multi-Root Workspace 中工作后,我发现对于“python.envFile”设置,在 Workspace 配置文件(即 .code-workspace 文件)中设置它不起作用但是在 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
G
Graham Hobbs

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) 就像 #2 我的设置中所说的 sunew:使用 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 交互式窗口和脚本中。


M
MathKid

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

例子

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

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."
在同一页面上,它说:“值可以引用系统中或文件中更早定义的任何其他环境变量”,这就是我们在这里所做的。文档似乎自相矛盾。
仍然没有帮助, ModuleNotFoundError 仍然存在(
我有两个虚拟环境,一个用于 src,一个用于 test,如何使其正常工作?另外,我对工作区文件夹感到困惑。在 settings.json 中,您使用的是 workspaceFolder,但在 .env 中,您使用的是 WORKSPACE_FOLDER。这将如何运作?
s
sunew

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

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

myproject/src

该项目在 pip 需要文件中定义了依赖项。

我的设置:

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

PYTHONPATH=./src:${PYTHONPATH}

请注意:在 Windows 上,您必须使用分号 ';'作为分隔符! env 文件中的 PYTHONPATH 定义与平台无关:code.visualstudio.com/docs/python/… 我自己花了很长时间才弄清楚这一点......
L
Leonardo Ramírez

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

C
ChalkTalk

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

关闭所有工作区。

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

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

重启vscode

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

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


S
SIDHARTH Kumar

我也有一个类似的问题,我在远程服务器上通过 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'的模型。我遵循完全相同的方式。在终端运行“which python”。它返回绝对路径。然后将此路径添加到python解释器的位置。这解决了我的问题。非常感谢@SIDHARTH Kumar
l
lcfd

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

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

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


B
BossGman

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

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


M
Manikandan Raju

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

效果很好!


你能提供更多信息吗?那个代码有什么作用?
P
Paul Roub

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

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

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


A
Alexandre Jaouën

这些是解决问题的3种不同方法:

1/ 编辑 PYTHONPATH

导出 PYTHONPATH=/Users/.../Projects/MyNewProject/src

python3 myfile.py 运行文件

2/ 编辑 VSCode 设置:

添加 "terminal.integrated.env.osx": {"PYTHONPATH": "${workspaceFolder}/src"} 到 VScode 中的 settings.json

3/ 将 setup.py 文件添加到您的 src/ 目录。

创建文件 src/setup.py

from setuptools import find_packages, setup

setup(
    name="sample",
    description="Sample Python Project",
    packages=find_packages(),
)

运行 python -m pip install -e ./src/ 将 src/ 中的所有模块作为包安装