关于VS Code调试Python时的执行路径

0.问题

在Python中按F5执行py文件时,默认是从当前打开的文件夹目录为执行路径。如果main入口在文件夹顶层还好,如果在子文件夹就会有些问题,比如相对路径导入模块时会报错。

如下,我执行子文件夹目录的moduleb.py,就报错说找不到另一个文件夹的模块(在main.py导入moduleb是正常的):

通过打印当前执行目录,可以发现路径还在VS Code打开文件夹的顶层目录:

1
2
import os
print(os.getcwd())

百度了一下VS Code在当前文件目录执行的方法,说是在设置中搜索Execute In File Dir勾选为true,但测试发现并没有用。

1.解决方法

经过不断的尝试,终于找到了一些在当前目录执行的方法:

1.0.修改launch配置

可以单独写在工程的.vscode目录:

也可以把那些设置放到VS Code的setting文件里(设置里搜json就能看到这个文件链接):

1.1.os.chdir设置当前工作目录

os.chdir可以修改当前工作目录,只要把这句话放到import其他路径模块之前就行了。对于脚本文件路径的获取,一般可以用sys.path[0]。sys.path是python的搜索模块的路径集,返回的结果是一个list。此列表的第一项,path[0],在程序启动时初始化,是包含用来调用Python解释器的脚本的目录。如果脚本目录不可用(例如,如果解释器被交互式地调用,或者脚本是从标准输入读取的),path[0]是空字符串,它引导Python首先在当前目录中搜索模块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#file:subsubmodule
import os,sys
#设置当前工作目录,放再import其他路径模块之前
os.chdir(sys.path[0])

#导入上上级目录
sys.path.append("../../")
#引入上上级目录下的模块
from submodulea.modulea import *


def func2():
    func()

if __name__=="__main__":
    func2()

可以把设置放到要执行的那个py文件。

1.2. sys.path.append添加顶层文件夹相对路径

当我们导入一个模块时:import xxx,默认情况下python解析器会搜索当前目录、已安装的内置模块和第三方模块,搜索路径存放在sys模块的path中。那我们在path中加入顶层文件夹的相对路径,不就相当于可以在顶层目录进行查找了吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import os,sys
#注意默认工作目录在顶层文件夹,这里是相对于顶层文件夹的目录
sys.path.append("./")

#导入上上级目录
sys.path.append("../../")
#引入上上级目录下的模块
from submodulea.modulea import *

def func2():
    func()

if __name__=="__main__":
    func2()

1.3.直接在VS Code终端运行

2.Python3模块相对路径

Python3中模块可以不用在目录下写__init__文件,如果是与文件同级的文件夹,可以直接import路径:

1
2
#file:main.py
from 文件夹A.mymodule import *

如果需要往上级目录跳,可以设置sys.path:

1
2
3
4
5
6
#file:main.py
import sys
#导入上上级目录
sys.path.append("../../")
#引入上上级目录下的模块
from 文件夹A.mymodule import *