怎么有效管理项目路径(避免使用绝对路径)
怎么有效管理项目路径(避免使用绝对路径)
import os
使用 os.path
方法会自动处理不同操作系统的路径分隔符(如 \
和 /
)
1.**current_dir = os.path.dirname(os.path.abspath(\__file__))
**
__file__
获取当前脚本的文件路径(可能是相对或绝对路径)os.path.abspath(__file__)
将路径转为绝对路径(确保路径是完整的)。os.path.dirname(...)
提取脚本所在的目录路径。- 最终
current_dir
是当前脚本的所在目录的绝对路径。
假设train.py文件的绝对路径为D:/workspace/MambaIR/basicsr/utils/train.py
。
假设在D:/workspace/MambaIR/basicsr/
下执行命令python ./utils/train.py
则此时:
(python ./utils/train.py
与python utils/train.py
没啥区别)
__file__
为utils/train.py
假设在D:/workspace/MambaIR/basicsr/utils/
下执行命令python train.py
。
__file__
为train.py
两种情况下只有__file__
有区别,下面这两个没区别。
os.path.abspath(__file__)
为D:/workspace/MambaIR/basicsr/utils/train.py
os.path.dirname(...)
为D:/workspace/MambaIR/basicsr/utils
2.parent_dir = os.path.abspath(os.path.join(current_dir, '..'))
..
是上一级目录的意思。parent_dir=D:/workspace/MambaIR/basicsr
from os import path as osp
3.root_path = osp.abspath(osp.join(__file__, osp.pardir, osp.pardir))
- 这里的
osp.pardir='..'
osp.abspath(osp.join(__file__, osp.pardir))
=osp.abspath(osp.join(__file__, '..'))
root_path=D:/workspace/MambaIR
4.sys.path.append(parent_dir)
- 目录路径添加到 Python 的模块搜索路径中
sys.path
:这是 Python 用来搜索模块(.py
文件)的路径列表。当在代码中使用import
时,Python 会按顺序在这些路径中查找对应的模块。.append(parent_dir)
:将parent_dir
添加到sys.path
列表的末尾,使得 Python 也能从该目录中导入模块。
my_project/
├── scr/
| ├── main.py
└── utils/
├── init.py
└── helpers.py
如果在 main.py
中想导入 helpers.py
,通常需要:from utils import helpers
但如果直接运行可能会报错 ModuleNotFoundError: No module named 'utils'
,因为 Python 默认只在以下位置搜索模块:
- 当前脚本所在目录(也就是
/myproject/scr
),而utils在/myproject
下。 - Python 标准库目录(如
/usr/lib/python3.8
) - 第三方库目录(如
~/.local/lib/python3.8/site-packages
)
通过 sys.path.append(parent_dir)
,显式地告诉 Python:“把 my_project/
也加入模块搜索路径”。
- 实例:
若文件结构为:
Temporal-Color-Constancy-master/
├── auxiliary/ # 被添加的路径
│ ├── model.py
│ ├── dataset.py
│ └── …
└── test/
└── test_rccnet.py # 运行脚本
运行test_rccnet.py
所使用的命令是:python ./test/test_rccnet.py
则可以通过在test_rccnet.py
中使用sys.path.append('./auxiliary/')
来实现from model import squeezenet1_1,CreateNet
from dataset import *
。
注:因为python ./test/test_rccnet.py
,所以./auxiliary/
中的 ./
"当前目录"表示的是:Temporal-Color-Constancy-master/
。
注意,当前的目录是你cd
到了哪个目录下,与你当前打开什么脚本,运行什么命令无关
比如说这张图片,当前的路径就是/run/