我试图了解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
答案 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。
免责声明:我在软件包中使用绝对导入,未经相对导入测试。