Vscode_Python运行相对路径的问题
参考资料
问题
在同一个文件夹下,脚本 A 无法访问文件 B
例如,这里 RSS_2_Cubox.py
使用相对路径无法访问 RSS_data.json
可以看到抛出异常,提示找不到文件
原因
正常运行
平常运行脚本都是在脚本所在目录去运行,工作目录就是脚本所在位置
例如我打开 A 文件夹,然后运行 a.py
,脚本 a.py
的工作目录就是 A 文件夹
所以在脚本 a.py
中去使用相对路径引用 A 文件夹下的其他文件是不会有问题的
像下面 A.py
去引用 b.json
是没有问题的
#脚本a.py的代码
with open("b.json", 'r', encoding='utf-8') as f:
data = json.load(f)
文件结构
A
├── A.py
└── b.json
vscode 运行
在 Vscode 因为打开的是工作文件夹,所以工作目录就是打开的工作文件夹
例如我打开工作文件夹 Python
,那么 Python 的工作目录就是 Python
文件夹
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
那么会提示找不到文件,
# 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
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
文件夹
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
即可)
{
// 使用 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"
}
]
}