当脚本为软链接时,如何获取正确的工作目录?
解决软链接执行时工作目录指向原文件目录的问题
问题本质
当通过软链接执行Python脚本时,Python会自动解析软链接到原文件路径,但__file__变量的绝对路径(通过os.path.abspath()或pathlib.Path.absolute())会保留软链接本身的路径。你遇到的情况大概率是脚本中误获取了原文件所在的A目录路径,或是混淆了脚本所在目录与当前工作目录。
解决方案
1. 强制切换工作目录到软链接所在的B目录
如果需要让脚本的工作目录始终是软链接所在的B目录,在脚本开头添加以下代码:
import os import pathlib # 获取软链接自身的绝对路径 script_link_path = pathlib.Path(__file__).absolute() # 获取软链接所在的目录 target_dir = script_link_path.parent # 切换工作目录到该目录 os.chdir(target_dir) # 验证:输出当前工作目录,应为B目录路径 print(os.getcwd())
若你的Python版本低于3.4(无pathlib模块),可使用os模块替代:
import os # 获取软链接自身的绝对路径 script_link_path = os.path.abspath(__file__) # 获取软链接所在的目录 target_dir = os.path.dirname(script_link_path) os.chdir(target_dir)
2. 仅获取软链接所在的B目录(不切换工作目录)
如果不需要改变当前工作目录,只是想在脚本中拿到B目录的路径,直接使用以下代码:
import pathlib script_link_path = pathlib.Path(__file__).absolute() # 直接获取软链接所在目录 link_dir = script_link_path.parent print("软链接所在目录:", link_dir)
低版本Python替代方案:
import os script_link_path = os.path.abspath(__file__) link_dir = os.path.dirname(script_link_path)
关键说明
os.getcwd()返回的是你执行命令时的终端工作目录,而非脚本所在目录;如果执行命令时你处于B目录,os.getcwd()默认就是B路径,无需额外处理。- 若脚本中之前通过
os.path.dirname(os.path.abspath(__file__))获取目录,该方法在软链接场景下会返回原文件A的路径,改用上述方法即可获取软链接所在的B目录。
内容的提问来源于stack exchange,提问作者user2751530
相关产品推荐
相关产品推荐

