关于VS Code调试Python时的路径问题

(于 2021-10-25 进行了更新 )

0.问题

在 VS Code 中按 F5 执行 py 文件时,默认是从当前打开的文件夹目录为执行路径 os.getcwd()(文件读写相对路径和这个有关),但是 Python 环境变量 sys.path[0] 默认是 py 文件所在目录(模块查找路径和这个有关)。如果 main 入口在文件夹顶层还好,如果在子文件夹就会有些问题,比如相对路径导入模块时会报错。

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

在顶层目录 top.py 打印路径:

import os,sys
#os.chdir(sys.path[0])
#sys.path.append(os.getcwd())

print('current path:',os.getcwd())
print('sys path:',sys.path)

输出:

current path: D:\py_project\TestPy_20211025_Path
sys path: 'd:\py_project\TestPy_20211025_Path',...

而在 a.py 打印路径,输出:

current path: D:\py_project\TestPy_20211025_Path
sys path: 'd:\py_project\TestPy_20211025_Path\sub_a',...

很明显,是当前的工作目录没被添加到 sys.path 环境变量中,需要统一。

1.解决方法

有的人可能需要执行目录也在 py 文件所在目录,而不是打开的工程文件夹顶层目录;有些人可能需要以工程文件夹顶层目录进行相对路径查找等。这里找了几种方法:

1.0.修改launch配置

可以单独写在工程的.vscode目录,cwd 控制的是当前工作目录 os.getcwd(),env.PYTHONPATH 控制的是环境变量 sys.path。也可以把那些设置放到 VS Code 的 setting.json 文件里(设置里搜 json 就能看到这个文件链接):

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "LaunchPath",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            //工作路径用打开的顶层目录,影响文件读写相对路径
            //"cwd": "${workspaceFolder}", 
            //工作路径用当前文件所在目录,影响文件读写相对路径
            //"cwd": "${fileDirname}",
            //sys.path 会加入顶层目录,影响模块导入查询路径
            //"env": { "PYTHONPATH": "${workspaceFolder}" }
        }
    ]
}

1.1.代码文件中修改

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

import os,sys
#os.chdir(sys.path[0]) 使用文件所在目录
#sys.path.append(os.getcwd()) 添加工作目录到模块搜索目录列表

直接在VS Code终端运行,可以看到路径输出如下:

 

2.Python3模块相对路径

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

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

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

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

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龚建波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值