如何获取被调用的Python脚本名称而非当前执行脚本名
获取被调用子脚本的文件名解决方案
针对你在Build_all.py中调用多个子脚本,却无法在子脚本中获取自身文件名的问题,分以下几种场景给出可行方案:
场景1:子脚本通过import加载(推荐)
如果你的Build_all.py是通过import方式引入子脚本,比如:
# Build_all.py import First_build import Second_build
那么在First_build.py/Second_build.py中直接使用__file__即可获取自身的文件路径,提取文件名可以结合os.path.basename():
# First_build.py import os current_script = os.path.basename(__file__) print(current_script) # 输出: First_build.py
这是Python模块调用的标准方式,__file__属性会准确指向当前模块的文件路径,不会受主脚本影响。
场景2:子脚本通过exec直接执行代码内容
如果你的Build_all.py是通过读取子脚本内容并执行(比如exec(open("First_build.py").read())),此时代码运行在主脚本的上下文里,默认的__file__会指向主脚本。解决方法是在调用时手动给子脚本传入__file__参数:
# Build_all.py def run_script(script_path): with open(script_path, 'r', encoding='utf-8') as f: script_code = f.read() # 构造局部命名空间,传入子脚本的路径作为__file__ local_namespace = {'__file__': script_path} exec(script_code, globals(), local_namespace) # 调用子脚本 run_script("First_build.py") run_script("Second_build.py")
之后在子脚本中就能正常使用__file__获取自身路径:
# First_build.py import os current_script = os.path.basename(__file__) print(current_script) # 输出: First_build.py
场景3:子脚本作为独立进程启动
如果允许子脚本以独立进程运行,可使用subprocess模块调用,这样子脚本的上下文完全独立,__file__或sys.argv[0]都能正常获取自身文件名:
# Build_all.py import subprocess # 调用子脚本,根据你的Python环境调整命令(比如python3) subprocess.run(["python", "First_build.py"]) subprocess.run(["python", "Second_build.py"])
子脚本中无需额外处理,直接使用:
# First_build.py import os import sys # 两种方式都可行 current_script1 = os.path.basename(__file__) current_script2 = os.path.basename(sys.argv[0]) print(current_script1) # 输出: First_build.py
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

