Python如何获取当前脚本的绝对路径_使用sys.argv与os.path.abspath定位

os.path.abspath(__file__)最可靠,因其不依赖当前工作目录且自动解析符号链接;而sys.argv[0]在import、-m运行或os.chdir()后易失效;推荐Python 3.4+用pathlib.Path(__file__).resolve()。

为什么 os.path.abspath(__file__) 是最可靠的方式

直接用 __file__ 获取当前脚本路径,再套一层 os.path.abspath(),就能稳定拿到绝对路径。它不依赖执行时的当前工作目录(cwd),也不受软链接影响(默认解析符号链接)。很多用户误用 sys.argv[0],但这个值在被 import 时可能为空、是相对路径、甚至指向解释器本身(比如用 python -m 运行时)。

常见错误现象:os.path.abspath(sys.argv[0]) 在以下场景失效:

  • 脚本被其他模块 import 而非直接执行
  • 通过 python -m mypackage.mymodule 启动
  • 当前目录被 os.chdir() 修改过

sys.argv[0] 什么时候能用,怎么补救

sys.argv[0] 只有在脚本作为主程序直接运行(即 __name__ == '__main__')且未被 -m 调用时才大概率可用。但它仍可能是相对路径或不含目录名(如只传了 python script.py 且当前就在脚本目录下)。

如果坚持用 sys.argv[0],必须手动补全:

  • 先用 os.path.dirname(sys.argv[0]) 提取目录部分
  • 若结果为空,说明 argv[0] 不含路径,则需用 os.getcwd() 拼接:os.path.join(os.getcwd(), sys.argv[0])
  • 最后再调用 os.path.abspath() 归一化

注意:os.getcwd() 返回的是启动 Python 时的目录,不是脚本所在目录 —— 这正是它不可靠的根本原因。

Python 3.4+ 推荐用 pathlib.Path(__file__).resolve()

pathlib 是现代 Python 的路径操作首选,resolve() 默认等价于 abspath() + 符号链接展开(类似 readlink -f)。它更语义清晰,链式调用也更自然。

Metaphor

一个新出炉的AI搜索引擎Metaphor

下载

示例:

from pathlib import Path
script_path = Path(__file__).resolve()
print(script_path)           # /home/user/project/myscript.py
print(script_path.parent)  # /home/user/project
print(script_path.stem)    # myscript

对比 os.pathpathlib 自动处理跨平台路径分隔符,无需额外调用 os.path.join();但要注意:如果脚本路径本身是损坏的符号链接且目标不存在,resolve() 会抛出 FileNotFoundError,而 os.path.abspath() 不会。

Windows 下要注意驱动器盘符和 UNC 路径

在 Windows 上,os.path.abspath(__file__)Path(__file__).resolve() 都会返回带盘符的路径(如 C:\project\script.py)。但如果脚本位于网络共享(UNC 路径),__file__ 可能以 \\server\share\... 开头,此时 abspath() 无法正常工作(会错误地补上当前驱动器),而 Path.resolve() 在 Python 3.12+ 才完全支持 UNC。

真实场景中,若需兼容 UNC:

  • 优先检测 __file__ 是否以 \\ 开头
  • 若是,跳过 abspath(),直接用 os.path.normpath(__file__)Path(__file__).as_posix()
  • 避免对 UNC 路径调用 os.getcwd() 拼接 —— 它在 UNC 下行为不稳定

这点容易被忽略:很多本地测试没问题的路径逻辑,在部署到文件服务器时突然失效,根源往往就在这里。

相关推荐:

长安启源 Q06 将于 7 月 15 日发布,定位中大型轿跑 SUV

7 月 12 日消息,长安汽车今日宣布,启源 Q06 将于 7 月 15 日 19:00 在上海正式发布。新车定位中大型轿跑 SUV,基于长安 SDA 天枢架构打造。新车采用纯电驱动,搭载最大功率 245 千瓦电机。注意到,该车官图此前已经公布,该车承袭家族扶光美学设计理念,前脸采用了启源品牌标志性的封闭式前格栅设计,匹配贯穿式的 LED 日间行车灯,车顶带有激光雷达,预计将搭载长安天枢领航辅助驾...

《斗罗大陆:传承》魂骨获取攻略

斗罗大陆传承魂骨怎么获取?在《斗罗大陆:传承》中,魂骨系统是角色战力成长的核心养成模块之一。不少玩家关注其获取方式与实际增益机制,本文将围绕魂骨的来源、装备规则、套装逻辑及实用策略进行系统梳理。 《斗罗大陆:传承》魂骨获取攻略 每位角色共设有6个魂骨佩戴位,对应不同魂兽躯干部位。系统支持组合式套装激活机制,主要分为2件套与4件套两类效果。例如曼陀罗系列2件套可提供特定属性加成,而泰坦雪魔4件套则赋...

《热血江湖:归来》戌狗获取攻略

热血江湖归来戌狗怎么获取?热血江湖IP焕新回归,全新资料片《热血江湖归来》正式上线,引发老玩家集体情怀共鸣。本次更新中,宠物系统迎来重磅升级,其中“戌狗”作为高人气橙色灵宠,凭借不俗的属性成长与战场表现,成为众多侠客争相培养的核心伙伴。本文将围绕戌狗的获取路径、养成逻辑与战力提升策略展开详解,助你高效打造专属忠犬,在群雄逐鹿的江湖中稳占一席之地。 《热血江湖:归来》戌狗获取攻略 新人玩家登录游戏后...

《仙逆:战天道》新手修士获取攻略

仙逆战天道新手修士怎么获取?第一次玩仙逆战天道,不知道该养哪个角色,搞懂仙逆战天道新手修士怎么获得、怎么组队,前面打怪通关会简单很多。 《仙逆:战天道》新手修士获取攻略 做完游戏开头的指引任务,就能拿到好几个可以上场的修士,每个角色拿到手的办法都不难。马良进游戏直接送,不管和谁组队都好用。打完第一张主线关卡就能拿到许立国,这个角色和马良一起上场,打怪效果会变好。打通第二关就能拿到李慕婉,这个角色可...

比亚迪全新 B 级闪充轿车秦 MAX 官宣,路天称定位在秦 L 之上

感谢网友 蒂姆OPPO 的线索投递! 7 月 13 日消息,比亚迪王朝网销售事业部总经理路天今日宣布,比亚迪为年轻朋友打造了一款大有不同的全新 B 级闪充轿车,它是秦家族的“超大杯”,定位在秦 L 之上,也是网上呼声很高的闪充秦 —— 秦 MAX。综合此前报道,这款车已出现在工信部申报名单中,包括纯电和插混版本,尺寸为 4866 x 1880 x 1495mm,轴距 2820mm。作为参考,比亚迪...

三国杀:一将成名SSS武将谋徐盛免费获取方法

三国杀一将成名谋徐盛如何免费获取,创玩节预约福利:免费送SSS谋徐盛!玩家们在7月2日~7月13日期间,参与预约活动集齐拼图,SSS武将谋徐盛免费抱回家。 三国杀:一将成名SSS武将谋徐盛免费获取方法: 一、免费送SSS谋徐盛 7月2日~7月13日期间,参与预约活动集齐拼图,SSS武将谋徐盛免费抱回家。 二、技能 体力:4  势力:吴 【勤强】 每回合每项限一次,你使用手牌时,可选择一项:1.令此...

燕云十六声对剑如晤获取方法

燕云十六声“对剑如晤”:传青州双元居界碑,进右手边屋子拾取桌上卷轴即可解锁。四段剑招,第三段耗30精元击倒,第四段单人672%外伤,双人联动可叠加至1344%爆发,冷却180秒。注意留精元、选平地、与队友提前沟通联动。 燕云十六声对剑如晤获取方法 一、获取方法 1、先打开地图,传青州双元居界碑。 2、落地就往右手边那屋子冲,别瞎逛,直接进。 3、屋里桌子上,明晃晃摆着个卷轴,点一下,直接解锁对剑如...

燕云十六声谢尧草药背篓获取方法

“谢尧草药背篓”是青州“风雪岱山”区域的一件隐藏“前尘旧物”。它的获取方式比较特殊,需要你在通关副本后,找到特定NPC提交道具才能解锁。 燕云十六声谢尧草药背篓获取方法 获取步骤 1、完成前置任务(硬性条件): 首先,需要推进主线,解锁青州地图。 然后,必须完成“青州侠迹”的卷一和卷三。 完成以上步骤后,即可解锁并通关镇守玩法“风雪岱山”,这包括打完所有剧情、完成客栈推理,并击败最终BOSS“鬼手...