【问题标题】:How to set the root directory for Visual Studio Code Python Extension?如何设置 Visual Studio Code Python 扩展的根目录?
【发布时间】:2018-10-09 21:34:08
【问题描述】:

我使用 VSCode Python 扩展 (ms-python.python) 运行和调试我的项目没有问题,但是由于 python 子项目根目录不是整个项目目录,所以从我的源中导入的所有内容都带有红色下划线并列出在problemsGo to definition 和一些类似的功能不能正常工作。 如何告诉 IDE 我的项目的起点在哪里:

Whole Project path:
  docs
  server
    entities
      user.py
      customer.py
  env
  viewer
  db

server 目录是导入路径的起始位置:

from entities.user import User

【问题讨论】:

    标签: python visual-studio-code


    【解决方案1】:

    您可以使用以下命令创建.env 文件:

    PYTHONPATH=server
    

    这将根据需要将您的 server 文件夹添加到 PYTHONPATH

    (您可能需要重新启动 VSCode 才能正确考虑 PYTHONPATH。)


    已编辑以澄清...

    在 repo 根目录下创建一个名为 .env 的文件,例如your_repo/.env.

    在您的消费代码所在的文件夹下创建文件,而不是在 repo 根目录下,似乎可以工作,例如your_repo/service/.env.

    更多详情请见documentation on environment variable definition files

    对我来说,这无需重新启动 VSC 即可工作,这可能是较新的 VSC 和扩展版本的问题。

    【讨论】:

    • 我不得不重新启动 VSC 才能让它工作 -- 花了很多时间
    • 你能澄清一下吗?我应该将.env 文件放在我项目的.vscode 文件夹中还是项目根文件夹中?它的名字应该只是.env,还是应该是python.env
    • @Ray 如果文件名为.env 并且位于您工作区的顶部,我们会自动获取该文件。您还可以手动指定设置的位置。详情请咨询docs on environment files
    • @BrettCannon:有没有办法检查这是否不起作用?我在 MacOS 上使用 VS Code,带有 Python 和 Pyright 扩展。修改 .env 文件 (PYTHONPATH=./apps:${PYTHONPATH}) 后,我确实重新启动了 VS Code。谢谢。
    • 应该是print(os.environ.get("PYTHONPATH")),即你需要.get()
    【解决方案2】:

    如果您使用的是Pylance 扩展,您可以通过python.analysis.extraPaths 选项设置您的源文件夹。它还默认查找常见的源文件夹名称,例如src,此选项称为python.analysis.autoSearchPaths

    转到文件 > 首选项 > 设置,搜索 pythonpath。在 Pylance 选项下,您应该会看到 Extra Paths,这是您设置源文件夹的位置。

    【讨论】:

    • Pylance 是我发现让 VSCode linter 识别我的其他搜索目录的唯一解决方案。谢谢!
    • 最简单的解决方案
    • 请记住在工作区的设置中应用此修改,以避免所有项目继承此额外路径
    • 我尝试了这两种设置,但是在切换到 pylance 后,我的所有导入都被破坏了 :(Unable to import 'my.library'pylint(import-error) 我正在使用src 作为根 python 目录的标准做法。pylance 想要保留在导入路径中包括src....
    【解决方案3】:

    PYTHONPATH 是一个环境变量,您可以设置它以添加其他目录,python 将在其中查找模块和包。

    如果需要为 Visual Studio Code 设置工作目录,

    更好的方法是自定义Settings.jsonlaunch.json,这样做:

    // vi .vscode/Settings.json
    {
        "python.pythonPath": "venv/bin/python",
    }
    
    

    使用cwd 来指定调试器的当前工作目录,它是代码中使用的任何相对路径的基本文件夹。如果省略,则默认为${workspaceFolder}(在 VS Code 中打开的文件夹)。

    // vi .vscode/launch.json
    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Python: your project name",
                "type": "python",
                "request": "launch",
                "cwd": "${workspaceRoot}/server",
            }
        ]
    }
    

    如果您希望服务器在没有任何 IDE 的情况下正常运行,只需在 PYTHONPATH 前面插入 Root Drectory 即可。假设有一个server/run.py

    import sys
    src_path = os.path.dirname(os.path.abspath(__file__))
    sys.path.insert(0, _src_path)   
    

    参考:https://code.visualstudio.com/docs/editor/debugging#_launch-versus-attach-configurations

    参考:https://code.visualstudio.com/docs/python/debugging#python-articles

    参考:https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH

    【讨论】:

    • 我相信,这里的PYTHONPATH 指的是环境变量PYTHONPATH 提供给python,而不是VSCode 的python.pythonPath 设置。因此,从技术上讲,设置 PYTHONPATH env 变量正是告诉 Python 源根源所需要的。
    • 是的,但是“根目录”的问题应该是“我如何告诉 IDE 我的项目的起点在哪里”
    • 实际问题是,如果我是正确的,all imports from my sources are underlined with red color ... go to definition don't work properly。 AFAICT,所有 VSCode Python 扩展关心的是导入的模块是可导入的,即位于 PYTHONPATH 上。至少,设置它为我解决了“下划线”和“转到定义”问题。并且绝对声明The PYTHONPATH is the path to Python interpreter 是错误的。我不知道是否还有其他我不知道的关于“根目录”的内容,但很可能与 TS 的问题无关。
    • @YuriShatrov 谢谢,我已经更新了声明The PYTHONPATH is an environment variable which you can set to add additional directories where python will look for modules and packages.
    【解决方案4】:

    如上所述,设置 PYTHONPATH 是它工作的原因。我使用以下 .env 内容,以便它适用于任何项目:

    PYTHONPATH=${PROJ_DIR}:${PYTHONPATH}
    

    这本质上是 PyCharm 在运行/调试配置中选中“将内容根添加到 PYTHONPATH”时所做的事情。这是一个有用的设置,但它会破坏你,因为你的代码在 PyCharm 之外失败。

    或者,如果你在终端中运行,首先导出:

    export PYTHONPATH=...
    

    【讨论】:

    • 在哪里可以在 launch.json/settings.json 中定义 export PYTHONPATH=?
    • 我没有尝试过,但是这些天我只是通过在代码中设置路径来解决这个问题:current_path = os.path.abspath(os.path.dirname(__file__))sys.path.append(current_path)project_dir = str(current_path)
    猜你喜欢
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    相关资源
    最近更新 更多