保存模型时想用一个软链接指向最新的 checkpoint 文件。python 创建软链接用 os.symlink,算两个路径之间的相对路径用 os.path.relpath。但要注意在算相对路径时,起始的路径应是一个文件夹,而不是文件,否则会多一个 ../
前缀导致错误。
Example
- 用
os.path.relpath
算相对路径指定start
时,对 destination link file(的绝对路径)用一次os.path.dirname
; - 在 windows 创文件夹的软链接时,要设
target_is_directory=True
; - 删文件夹软链接的方法参考 [1,2]。
import os
# 例 1:源文件、软链接在不同目录
f = os.path.expanduser("~/data/NCR-data.tar")
link_f = os.path.expanduser("~/codes/test-data.tar")
print(os.path.relpath(f, start=link_f)) # ../../data/NCR-data.tar
os.symlink(os.path.relpath(f, start=link_f), link_f) # 错
print(os.path.relpath(f, start=os.path.dirname(link_f))) # ../data/NCR-data.tar
os.symlink(os.path.relpath(f, start=os.path.dirname(link_f)), link_f) # 对
# 例 2:源文件、软链接在同一目录
f = os.path.expanduser("~/codes/test.pth")
link_f = os.path.expanduser("~/codes/latest-model.pth")
print(os.path.relpath(f, start=link_f)) # ../test.pth
os.symlink(os.path.relpath(f, start=link_f), link_f) # 错
print(os.path.relpath(f, start=os.path.dirname(link_f))) # test.pth
os.symlink(os.path.relpath(f, start=os.path.dirname(link_f)), link_f) # 对
# 例 3: 文件夹
d = os.path.expanduser("~/data/cityscapes")
link_d = os.path.expanduser("~/codes/test-dir")
print(os.path.relpath(d, link_d)) # ../../data/cityscapes
os.symlink(os.path.relpath(d, link_d), link_d, target_is_directory=True) # 错
print(os.path.relpath(d, os.path.dirname(link_d))) # ../data/cityscapes
os.symlink(os.path.relpath(d, os.path.dirname(link_d)), link_d, target_is_directory=True) # 对