如何在function内部判断其是当前脚本运行还是作为imported module运行
实现方案
可以实现该需求,核心利用Python模块的内置属性特性:每个模块的__name__属性在模块作为入口脚本直接运行时取值为__main__,作为依赖被其他脚本导入时取值为模块自身的名称。
由于函数的全局命名空间绑定的是它定义所在模块的命名空间,而非调用方的命名空间,因此可以直接在函数内部读取该属性判断运行场景,示例代码如下:
def func(): if __name__ == "__main__": # 所属脚本直接运行时执行的逻辑 print("函数在所属脚本内直接运行") else: # 作为导入模块被调用时执行的逻辑 print("函数被其他脚本导入后运行")
补充说明
- 上述写法已经覆盖绝大多数常规使用场景,如果需要兼容函数嵌套定义、动态生成等特殊场景,可以用
inspect模块显式获取函数所属模块再做判断:
import inspect def func(): current_module = inspect.getmodule(func) if current_module.__name__ == "__main__": print("所属脚本直接运行") else: print("被其他脚本导入调用")
- 测试方法:
- 把代码写入
demo.py,末尾添加func(),直接运行python demo.py,会输出直接运行对应的提示 - 新建另一个脚本
import_demo.py,写入from demo import func; func(),运行该脚本,会输出被导入对应的提示
- 把代码写入
内容的提问来源于stack exchange,提问作者cerebrou
相关产品推荐
相关产品推荐

