VSCode-在终端和pythonpath中运行Python文件

时间:2019-01-06 15:31:38

标签: python visual-studio-code

我试图了解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

3 个答案:

答案 0 :(得分:1)

使用Python运行hello.py时,PVSC正在使用终端运行python proj/main/hello.py。对于从python hello.py目录运行proj/main的Python来说,这意味着解释器甚至看不到hello.py所包含的包(因此,它没有{{ 1}})。

未使用proj.util文件,因为该文件再次只是在终端中的直接执行,并且您的终端或Python都不会读取.env文件。但是,当您使用调试器时,我们会指定一些详细信息,例如使用.env文件,以及为什么调试器会按您的期望设置.env

答案 1 :(得分:0)

只需将这些行添加到要执行的文件的顶部

if __name__ == "__main__":
    import os
    import sys
    sys.path.append(os.getcwd())
  

当直接执行__name__ == "__main__"时,这些脚本会将文件所在的目录添加到路径中。

答案 2 :(得分:0)

TLDR:使用正确的PYTHONPATH启动VS代码

我的设置: 更改为项目目录时,使用direnv(https://direnv.net/)从.env自动设置项目特定的PYTHONPATH。 这还将为项目设置所需的虚拟环境。 从命令行启动VS Code,以便它使用正确的环境变量。

或者,您可以创建一个Shell脚本来设置正确的环境变量并启动VS Code。

免责声明:我在软件包中使用绝对导入,未经相对导入测试。