Vscode_Python运行相对路径的问题


Tags: #Python  #软件  #问题 
Created: 
Updated:

参考资料

问题

在同一个文件夹下,脚本 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 是没有问题的

#脚本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"
    }
  ]
}