如何从被导入文件调用主文件函数?或获取导入方文件目录?
两种可行方案
一、不导入main.py调用里面的函数
直接用Python的inspect模块追踪调用栈,拿到main模块的全局变量就能调用函数了。修改library.py代码如下:
import inspect def dosumthing(): # 取调用栈的上一层,也就是main.py调用这个函数的上下文 caller_frame = inspect.stack()[1] main_globals = caller_frame[0].f_globals # 直接调用main.py里的saysom函数 main_globals['saysom']()
⚠️ 注意:这种方式依赖调用层级,如果后续调用关系变了(比如别的脚本也调用dosumthing),可能会出错;另外如果main.py不是作为主程序运行(比如被其他脚本导入),也可能出问题。
二、获取main.py的所在目录
有两种简单的实现方式:
方式1:用inspect模块
import inspect import os def dosumthing(): # 获取主模块的源码文件路径 main_file_path = inspect.getsourcefile(inspect.main) # 提取目录 main_dir = os.path.dirname(os.path.abspath(main_file_path)) print("main.py所在目录:", main_dir)
方式2:用sys.argv
import sys import os def dosumthing(): # sys.argv[0]就是启动的主脚本路径 main_file_path = sys.argv[0] main_dir = os.path.dirname(os.path.abspath(main_file_path)) print("main.py所在目录:", main_dir)
⚠️ 小提醒:如果是在交互式环境里运行main.py,sys.argv[0]可能是空字符串,这时候用inspect的方法更稳妥。
内容的提问来源于stack exchange,提问作者reidisabot
相关产品推荐
相关产品推荐

