如何动态获取当前执行的Python脚本名?

文章目录

    • 1、情景描述
    • 2、如何获取调用者脚本名?
    • 3、sys._getframe()总结



1、情景描述


当我们在使用Python进行一些操作时,如果我们希望我们封装的模块里的方法能够在给使用者调用的同时可以获取到调用者当前正在执行的Python脚本名,以做一些后续操作。这听起来好像跟反射有异曲同工之处。反射可以实现吗?

来看一个需求:

现有一个用于封装工具API的模块:module.py,如下:

def do():...# 处理中间过程...return 'result'

该模块中有一个方法do()供调用者调用。现在有一个需求:该方法中的处理中间过程需要获取到调用者当前执行的Python脚本名,并做一些处理操作,最后返回给调用者结果

这种情况需要如何实现呢?可以尝试以下办法:

2、如何获取调用者脚本名?


2.1、方式1:使用反射?

在Java中,我们知道反射是指在类加载时动态获取类的成员(包括类、属性、方法等),以对类和对象进行修改。在Python中,这类似。反射可以动态获取对象的属性和方法,但对于Python脚本,好像和它没啥关系吧?更何况Python脚本名呢

2.2、方式2:使用os模块?

Python内置的os模块提供一些文件和路径处理的方法,兴许这里面有可以帮我们完成这个需求的方法呢

os模块中的__file__属性可用于返回当前脚本的文件路径,包括文件名,结合os.path.basename()是否可以获取调用者的脚本名呢?马上进行下面尝试:

工具API模块:module.py

import osdef do():print(os.path.basename(__file__))

调用者模块:client.py

from module import dodo()'''
module.py
'''

什么情况?我要获取的是调用者脚本名,我需要你打印出来的是client.py,而不是module.py

从结果可见,这种方式不太行啊

2.3、使用sys模块?

Python内置的sys模块主要用于Python解释器和系统之间的交互,例如获取系统环境变量。sys可以实现吗?

sys提供了一个函数sys._getframe()用于查看函数被什么函数调用及被第几行调用以及被调用函数所在的文件

sys._getframe(depth)从调用堆栈返回一个框架对象。 如果给定了可选整数depth,则返回在堆栈顶部以下调用多次的框架对象。depth的默认值为0,返回调用堆栈顶部的帧。如果参数比调用堆栈更深,则会引发ValueError异常

sys._getframe()的更多使用见文末总结

来试一下吧

工具API模块:module.py

import os
import sysdef do():print(os.path.basename(sys._getframe().f_back.f_code.co_filename))

调用者模块:client.py

from module import dodo()'''
client.py
'''

嗯嗯,sys模块的sys._getframe()可以帮我们完成上述需求,但较为复杂,不好理解

2.4、sys获取argv

sys提供的sys.argv[]可用于访问命令行参数。然而,sys.argv[0]可用于获取正在执行的Python脚本本身

这可能是最好的一种方式。示例如下:

工具API模块:module.py

import os
import sysdef do():print(os.path.basename(sys.argv[0]))

调用者模块:client.py

from module import dodo()'''
client.py
'''

这不是更完美吗?

3、sys._getframe()总结


sys._getframe()的常用使用总结如下:

'''
sys._getframe(0)                       # 被调用模块层
sys._getframe(1)                       # 调用者模块层
sys._getframe().f_back                 # 调用者模块层,和sys._getframe(1)相同
sys._getframe(0).f_code.co_filename    # 被调用模块当前文件名,也可以通过__file__获得
sys._getframe(1).f_code.co_filename    # 调用者模块当前文件名,和sys._getframe().f_back.f_code.co_filename相同
sys._getframe(0).f_code.co_name        # 被调用模块层当前函数名
sys._getframe(1).f_code.co_name        # 调用者模块层调用所在函数名,如果没有,则返回<module>
sys._getframe(0).f_lineno              # 被调用模块层被调用函数的行号
sys._getframe(1).f_lineno              # 调用者模块层调用该函数所在的行号
'''

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/187354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

门户网站二级等保评测问题,服务器漏洞问题解决办法

二级等保查出来的服务器问题 操作前可在自己服务器测试一下&#xff0c;看看有没有用 1.服务器定时更换密码 永久&#xff08;需重启&#xff09; vim /etc/login.defs PASS_MAX_DAYS 90 # 密码最长过期天数 PASS_MIN_DAYS 0 # 密码最小过期天数 PASS_MIN_LEN 10 # 密码…

Conda 安装Jupyter:使用Pyhive(Kerberos)

安装基本环境 conda create -n bigdata python3.10 conda activate bigdata conda install -y pandas numpy pyhive yum install gcc-c python-devel.x86_64 cyrus-sasl-devel.x86_64 pip install sasl Jupyter Notebook 安装jupyter notebook配置自动提示 conda insta…

JavaScript中的时间日期函数new Date()(JS中5种获取时间戳的函数)

简介&#xff1a;JavaScript 中的 new Date() 方法用于创建一个新的 Date 对象&#xff0c;该对象表示当前日期和时间。Date 对象提供了许多方法和属性&#xff0c;可以用于获取和设置日期和时间信息。 new Date([year, month, day, hour, minute, second, millisecond]) 其中…

重生奇迹mu武器镶嵌顺序

一、武器的镶嵌顺序&#xff1a; 雷冰火30%概率出现技能11 从上到下的镶嵌顺寻按照雷、冰、火镶嵌&#xff0c;就有30%的概率出现技能攻击力加11的幸运荧光属性。 从上到下的镶嵌顺寻按照火、冰、雷镶嵌&#xff0c;就有30%的概率出现攻击力加11的幸运荧光属性。 例如&…

【图像拼接(Image Stitching)】关于【图像拼接论文精读】专栏的相关说明,包含专栏使用说明、创新思路分享等(不定期更新)

文章目录 前言专栏简介适用人群使用方法阅读顺序潜在的创新方向【图像拼接论文精读】专栏文章目录 前言 为什么会有这篇文章&#xff1f; 因为专栏简介里写不下太多东西&#xff0c;只能通过这篇文章和大家交流&#xff0c;算是一个专栏阅读指南吧。 说点心里话 本来吧&…

Hi-Net:用于多模态MR图像合成的混合融合网络

Hi-Net: Hybrid-Fusion Network for Multi-Modal MR Image Synthesis Hi-Net&#xff1a;用于多模态MR图像合成的混合融合网络背景贡献实验方法the modality-specific network&#xff08;模态特定网络&#xff09;multi-modal fusion networkmulti-modal synthesis network 损…

TQ2440开发板-LED全亮全灭控制程序设计

目录 什么是GPIOS3C2440的GPIO访问和控制方式&#xff1a;3种寄存器 TQ2440的LED灯底板原理图---LED测试部分核心板原理图----GPIO部分 LED控制---设计思想整体代码 && 代码研读配置GPIO端口为输出模式控制LED的全亮和全灭 真就是从零学起。 什么是GPIO GPIO&#xff…

Vue3+ElementPlus,image动态更新src

我想通过点击图片动态更新src&#xff0c;代码如下&#xff1a; <el-image style"width: 100px; height: 30px" :src"ImageUrl" click"refresh" :fit"fit" /> const ImageUrl reactive(http://localhost:9001/getImage)const…

20个Python源码项目下载

20个很不错的Python项目源码&#xff0c;其中包括适合毕业设计的项目。这些资源中涵盖了Django 3版本的项目&#xff1a; DjangoMysqlBulma实现的商场管理系统源码 PythonDjango实现基于人脸识别的门禁管理系统 PythonFlaskMySQL实现的学生培养计划管理系统 Python大熊猫主题人…

使用yolov7进行多图像视频识别

1.yolov7你可以让你简单的部署,比起前几代来说特别简单 #下面是我转换老友记的测试视频,可以看到几乎可以准确预测 2.步骤 1.在github官网下载代码 https://github.com/WongKinYiu/yolov7 2.点击下载权重文件放到项目中 3.安装依赖,我的python版本是3.6的 pip install -r requ…

Java8 之 Optional 详解

目录 一. 前言 二. Optional 用法 2.1. 概要 2.2. 创建 Optional 对象 2.3. 获取 Optional 对象的值 2.4. 检查 Optional 对象是否为空 2.5. 安全访问 Optional 对象的值 2.6. 处理过滤操作 2.7. 处理转换操作 2.8. 使用默认值 三. Optional 使用场景 3.1. 空判断 …

RPC与HTTP的详细比较

RPC 示例&#xff08;使用 gRPC&#xff09; 在这个例子中&#xff0c;我们使用 gRPC&#xff08;一个流行的 RPC 框架&#xff09;来演示 RPC 的基本用法。我们创建一个简单的计算器服务&#xff0c;客户端可以调用服务器上的加法操作。 服务定义 - Calculator.proto&#x…

深度解析 Dockerfile:构建可重复、可扩展的Docker镜像

文章目录 什么是Dockerfile&#xff1f;Dockerfile的基本结构常用Dockerfile指令解析1. FROM2. LABEL3. WORKDIR4. COPY5. RUN6. EXPOSE7. ENV8. CMD 构建可重复、可扩展的Docker镜像1. 指定基础镜像的版本2. 合理使用缓存3. 精简镜像4. 使用多阶段构建 总结 &#x1f388;个人…

提升网页交互体验的秘密武器——防抖和节流

说在前面 在现代Web开发中&#xff0c;提高网页性能是至关重要的。本文介绍了防抖和节流这两种常用的性能优化技术&#xff0c;通过控制函数的执行频率&#xff0c;有效减少不必要的计算和网络请求&#xff0c;从而提升用户体验和页面加载速度。 函数节流 节流是指限制一个函数…

【分享】centos7vim异常

问题描述: 虚拟机安装centos7&#xff0c;安装vim后异常&#xff0c;上下左右键会变成abcd,退格键无法删除。 系统版本: CentOS Linux release 7.5.1804 (Core) 原因: 暂时未知&#xff0c;有可能是vim安装时&#xff0c;一个组件未安装导致。后续追溯 解决方案: echo &quo…

nginx之rewrite

rewrite rewrite 作用是地址重定向&#xff0c;语法&#xff1a;rewrite regex replacement[flag]; 根据 regex&#xff08;正则表达式&#xff09;匹配请求地址&#xff0c;然后跳转到 replacement&#xff0c;结尾是flag标记 如下例子&#xff0c;请求地址是 http://192.168.…

异常 Exception 练习题 (未完成)

异常 Exception 练习题 try-catch异常处理1234 异常1&#xff08;没有自己写&#xff09;234 try-catch异常处理 1 class Exception01 {public static int method() {try {String[] names new String[3];//String[]数组if (names[1].equals("tom")) {//NullPointe…

血的教训---入侵redis并免密登录redis所在服务器漏洞复现

血的教训—入侵redis并免密登录redis所在服务器漏洞复现 今天就跟着我一起来入侵redis并免密登录redis所在服务器吧&#xff0c;废话不多说&#xff0c;我们直接开始吧。 这是一个体系的学习步骤&#xff0c;当然如果基础扎实的话可以继续往下面看 以下都是关联的文章&#xff…

Unity3D 导出的apk进行混淆加固、保护与优化原理(防止反编译)

Unity3D 导出的apk进行混淆加固、保护与优化原理&#xff08;防止反编译&#xff09; 目录 前言&#xff1a; 准备资料&#xff1a; 正文&#xff1a; 1&#xff1a;打包一个带有签名的apk 2&#xff1a;对包进行反编译 3&#xff1a;使用ipaguard来对程序进行加固 前言&…

C++ 学习之匿名名字空间的使用细节

匿名命名空间&#xff08;anonymous namespace&#xff09;是C中的一种特殊命名空间&#xff0c;它没有显式的名称。匿名命名空间可以用来定义仅在当前文件中可见的全局变量、函数和类。 由于没有名字&#xff0c;所以相当于直接引入&#xff0c;但是没有引入定义 如果发生冲…