Vscode_Python运行相对路径的问题

参考资料

问题

在同一个文件夹下,脚本 A 无法访问文件 B
例如,这里 RSS_2_Cubox.py 使用相对路径无法访问 RSS_data.json

Pasted image 20230330123427

可以看到抛出异常,提示找不到文件

Pasted image 20230330123559

原因

正常运行

平常运行脚本都是在脚本所在目录去运行,工作目录就是脚本所在位置
例如我打开 A 文件夹,然后运行 a.py,脚本 a.py 的工作目录就是 A 文件夹
所以在脚本 a.py 中去使用相对路径引用 A 文件夹下的其他文件是不会有问题的

像下面 A.py 去引用 b.json 是没有问题的

1
2
3
#脚本a.py的代码
with open("b.json", 'r', encoding='utf-8') as f:
data = json.load(f)

文件结构

1
2
3
A
├── A.py
└── b.json

vscode 运行

在 Vscode 因为打开的是工作文件夹,所以工作目录就是打开的工作文件夹
例如我打开工作文件夹 Python,那么 Python 的工作目录就是 Python 文件夹

1
2
3
4
5
6
7
8
9
10
11
12
Python
└── Rss2Cubox
├── create_Pool.py
├── cubox_api.py
├── ip_pool.json
├── my.log
├── RSS_2_Cubox.py
├── RSS_config.db
├── RSS_data.json
├── sqlite_operate.py
├── __pycache__
└── 测试使用

而如果这时候我去运行 Rss2Cubox 项目下的脚本
RSS_2_Cubox.py 使用相对路径引用 RSS_data.json 那么会提示找不到文件,

1
2
3
# RSS_2_Cubox.py
with open("RSS_data.json", 'r', encoding='utf-8') as f:
data = json.load(f)

因为工作目录是 Python,所以相对路径应该写成 Rss2Cubox/RSS_data.json 才可以
相对路径应该是相对于 Python 这个文件夹而言

解决方法

推荐第 3 种,其他两种麻烦,或者需要重新配置调试

修改相对路径

修改相对路径成相对于工作文件夹的路径
例如以下结构,RSS_2_Cubox.py 引用 RSS_data.json
那相对路径应该写成 Rss2Cubox/RSS_data.json,而不是 RSS_data.json

1
2
3
4
5
6
7
8
9
10
11
12
Python
└── Rss2Cubox
├── create_Pool.py
├── cubox_api.py
├── ip_pool.json
├── my.log
├── RSS_2_Cubox.py
├── RSS_config.db
├── RSS_data.json
├── sqlite_operate.py
├── __pycache__
└── 测试使用

弊端:迁移项目到其他路径下的时候,所有相对路径又要替换,所以这种方式不推荐,太麻烦

打开对应目录

使用 vscode 直接打开项目文件夹,而非工作文件夹

例如下面 Python 是工作文件夹,Rss2Cubox 是项目文件夹
使用 Vscode 应该打开 Rss2Cubox 文件夹,而不是 Python 文件夹

1
2
3
4
5
6
7
8
9
10
11
12
Python
└── Rss2Cubox
├── create_Pool.py
├── cubox_api.py
├── ip_pool.json
├── my.log
├── RSS_2_Cubox.py
├── RSS_config.db
├── RSS_data.json
├── sqlite_operate.py
├── __pycache__
└── 测试使用

弊端:每个项目需要单独配置调试文件,不推荐,也比较麻烦

配置调试文件

修改 launch.json,配置 cwd 为运行的文件所在目录

  • 设置为 ${workspaceFolder} 就是以工作文件夹为运行环境
  • 设置为 ${fileDirname} 就是以脚本所在位置为运行环境

示例(默认是 workspaceFolder,将其设置为 fileDirname 即可)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "终端",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"cwd": "${fileDirname}",
"justMyCode": true
},
{
"name": "控制台",
"type": "python",
"request": "launch",
"console": "internalConsole",
"stopOnEntry": false,
"program": "${file}",
// "cwd": "${workspaceFolder}",
"cwd": "${fileDirname}",
"env": {},
"envFile": "${workspaceFolder}/.env"
}
]
}


Vscode_Python运行相对路径的问题
https://linguoguang.com/2023/03/30/Vscode_Python运行相对路径的问题/
作者
linguoguang
发布于
2023年3月30日
许可协议