如何在Python已加载模块中获取导入该模块的脚本文件路径?
实现方案
直接借助Python标准库sys和os即可实现,不需要安装第三方依赖。
修正后可运行代码
module.py代码:
import sys import os def main_file_path(): # 转换为绝对路径,兼容相对路径启动的场景 main_abs_path = os.path.abspath(sys.argv[0]) print(main_abs_path) return main_abs_path
main.py代码:
import module # 运行时会自动打印main.py自身的绝对路径 module.main_file_path()
原理说明
- Python启动时会自动初始化
sys.argv参数列表,列表第一个元素sys.argv[0]永远指向当前被直接执行的入口脚本路径,和代码写在哪个模块里无关,哪怕嵌套多层导入也不会改变这个值。 - 用
os.path.abspath()做一层转换,是因为如果用户用相对路径执行脚本(比如在main.py所在目录执行python main.py),sys.argv[0]只会返回相对路径字符串main.py,转成绝对路径才能拿到完整的文件位置。 - 避坑提示:不要在模块里用
__file__变量获取路径,模块内的__file__永远指向module.py自身的存储位置,拿不到入口main脚本的路径。
补充说明:该方案仅适用于脚本启动场景,如果在Python交互式解释器(REPL)中调用函数,
sys.argv[0]会返回空字符串,属于正常现象。
内容的提问来源于stack exchange,提问作者Timo
相关产品推荐
相关产品推荐

