VSCode - 在终端和 pythonpath 中运行 Python 文件
Posted
技术标签:
【中文标题】VSCode - 在终端和 pythonpath 中运行 Python 文件【英文标题】:VSCode - Run Python File in Terminal and pythonpath 【发布时间】:2019-06-01 10:46:03 【问题描述】:我试图了解 VSCode 与运行存储在项目子包中的 python 脚本相关的行为。 如果我的项目结构如下:
proj/
util/
main/hello.py
test/
如果 hello.py 从 proj.util 导入——并且我使用“在终端中运行 Python 文件”来执行脚本,它会失败并显示找不到模块 (proj.util)——因为默认情况下不会添加项目***目录到pythonpath。如果我在根目录中创建 .env 文件并添加 PYTHONPATH 的定义以包含我的项目***目录,则在通过上述选项运行时同样不使用此文件。
如果我创建了一组默认的调试启动并使用“终端中的调试 Python 当前文件” - 这将读取 .env 文件并按预期工作。
在终端中运行脚本时,PyCharm 会自动将***项目目录添加到 sys.paths - VSCode 不应该提供这样的选项还是我遗漏了什么?
当前版本如下,虽然我在 Windows 下看到相同的行为。
Version: 1.30.1
Commit: dea8705087adb1b5e5ae1d9123278e178656186a
Date: 2018-12-18T22:23:23.072Z
Electron: 2.0.16
Chrome: 61.0.3163.100
Node.js: 8.9.3
V8: 6.1.534.41
OS: Linux x64 4.19.12-arch1-1-ARCH
【问题讨论】:
此问题可能与github上的以下讨论和一个未解决的问题有关:-github.com/Microsoft/vscode-python/issues/2206-github.com/Microsoft/vscode-python/issues/944 【参考方案1】:当您让 Python 运行 hello.py
时,PVSC 正在使用终端运行 python proj/main/hello.py
。对于 Python,这与从 proj/main
目录运行 python hello.py
相同,这意味着解释器甚至看不到 hello.py
包含在其中的包(因此它没有 proj.util
的概念)。
.env
文件未被使用,因为该文件再次只是在终端中直接执行,您的终端或 Python 都不会读取 .env
文件。但是,当您使用调试器时,我们会指定详细信息,例如使用您的 .env
文件,以及调试器为何按照您的预期设置 PYTHONPATH
。
【讨论】:
Brett 谢谢 - 这是预期的行为和按设计工作,或者我们是否期望一种配置选项以允许将项目目录添加到 python 路径的方法 - 以便可以运行子包中的脚本?我使用了另外两个环境——PyCharm 和 Emacs-LSP(使用 MS Python 语言服务器)/Elpy——默认情况下,这两个环境都允许在从项目中导入包的同时运行脚本。我知道可以使用调试启动 - 但这感觉不直观。 目前是设计使然,因为 VS Code 更喜欢我们使用launch.json
。您可以使用code runner extension 以及打开功能请求github.com/microsoft/vscode-python。【参考方案2】:
只需将这些行添加到您要执行的文件的顶部
if __name__ == "__main__":
import os
import sys
sys.path.append(os.getcwd())
这些脚本在直接执行时将文件所在的目录添加到您的路径中,
__name__ == "__main__"
表示。
【讨论】:
【参考方案3】:TLDR:使用正确的 PYTHONPATH 启动您的 VS 代码
我的设置: 切换到项目目录时,使用 direnv (https://direnv.net/) 自动从 .env 设置项目特定的 PYTHONPATH。 这也为项目设置了所需的虚拟环境。 从命令行启动 VS Code,使其使用正确的环境变量。
您也可以创建一个 shell 脚本来设置正确的环境变量并启动 VS Code。
免责声明:我在我的包中使用绝对导入,这没有使用相对导入进行测试。
【讨论】:
以上是关于VSCode - 在终端和 pythonpath 中运行 Python 文件的主要内容,如果未能解决你的问题,请参考以下文章
在Linux添加PYTHONPATH方法以及修改环境变量方法