首页 > 编程问答 >python 如何获取导入包中运行脚本的文件名

python 如何获取导入包中运行脚本的文件名

时间:2024-08-03 17:33:16浏览次数:11  
标签:python

我有两个脚本:

main.py

import package.py

package.py

import os
print(os.path.basename(_file_))

我的预期输出是 main.py ,但我得到 package.py

那么我如何在包脚本中获取正在运行的脚本的文件名?

额外描述 :

事实是,我在 package.py 中有一个装饰器函数。它将在当前路径生成一个文件,并以调用它的文件名命名。


可以使用 inspect 模块来获取导入包中运行脚本的文件名。

以下是修改后的 package.py 代码:

import os
import inspect

def get_caller_filename():
    """获取调用者文件名."""
    frame = inspect.stack()[2]
    module = inspect.getmodule(frame[0])
    filename = module.__file__
    return os.path.basename(filename)

def my_decorator(func):
    def wrapper(*args, **kwargs):
        caller_filename = get_caller_filename()
        print(f"调用脚本的文件名: {caller_filename}")
        # 在此处使用 caller_filename 生成文件
        return func(*args, **kwargs)
    return wrapper

解释:

  1. inspect.stack() : 此函数返回调用堆栈的列表,每个元素代表一个堆栈帧。
  2. inspect.stack()[2] : 我们获取堆栈列表中的第三个元素(索引为 2),因为它代表调用 get_caller_filename() 函数的函数的调用信息。第一个元素是 get_caller_filename() 本身,第二个是 my_decorator wrapper 函数。
  3. inspect.getmodule(frame[0]) : 从堆栈帧中获取模块对象。
  4. module.__file__ : 获取模块的文件路径。
  5. os.path.basename(filename) : 从文件路径中提取文件名。

现在,当你在 main.py 中调用 package.py 中的函数时, get_caller_filename() 函数将返回 main.py 作为调用脚本的文件名.

注意:

  • 这种方法依赖于调用堆栈,因此如果在 package.py 中的多个层级函数调用之间传递调用信息,则需要相应地调整 inspect.stack() 的索引。
  • 确保 package.py main.py 导入,而不是直接运行。

标签:python
From: 52306091

相关文章

  • Python+Pycharm下载安装教程,基础知识(详细教程)
    这是一篇针对初学者的 Python 基础教程,只要你认真阅读,花费30分钟即可快速了解Python。这篇Python入门教程讲解的知识点包括:Python编程环境的搭建、Python基本操作入门、Python数据类型、Python语句和函数。Python环境下载和配置根据Windows版本(64位/32位)从P......
  • 在Python中发出警告而不中断程序
    我试图在Python中发出警告,而不会使程序崩溃/停止/中断。我使用以下简单函数来检查用户是否向其传递了非零数字。如果是这样,程序应该警告他们,但继续正常进行。它应该像下面的代码一样工作,但应该使用类Warning()、Error()或Exception()而不是手动......
  • Python中动态类和动态方法的创建与调用
    借助于python的动态语言特性,很容易对对象进行添加方法或者属性,这也是python的灵活之一。动态生成类的属性及其方法在某些情况可能要根据不同的参数来动态生成不同的实例方法、静态方法、类方法。下面的例子中则展示了如何动态地向类中添加属性和方法。importtypesclassPers......
  • Python学习中最常见的10个列表操作问题
    列表是Python中使用最多的一种数据结果,如何高效操作列表是提高代码运行效率的关键,这篇文章列出了10个常用的列表操作,希望对你有帮助。1、迭代列表时如何访问列表下标索引普通版:items=[8,23,45]forindexinrange(len(items)):print(index,"-->",items[index])​......
  • Python中定义(创建)、调用函数及返回值
    1.定义(创建)函数要调用一个函数,首先要定义它。在Python中使用关键字def来定义一个函数。函数通常由函数名、参数列表以及一系列语句组成的函数体构成的。函数定义的一般格式如下:def函数名(参数列表):函数体例如:defsayhello(): print('hello')最简单的函数:defm......
  • python用List的内建函数list.sort进行排序
    对List进行排序,Python提供了两个方法方法1用List的内建函数listsort进行排序listsort(func=None,key=None,reverse=False)Python实对List进行排序,Python提供了两个方法方法1.用List的内建函数list.sort进行排序list.sort(func=None,key=None,reverse=False)>>>list=......
  • 禁用 GIL 的 Python 3.13 非常慢
    我对python3.12.0与使用3.13.0b3标志编译的python--disable-gil进行了简单的性能测试。该程序使用ThreadPoolExecutor或ProcessPoolExecutor执行斐波那契数列的计算。引入禁用GIL的PEP文档表示,存在一些开销,主要是由于有偏差......
  • 有没有办法阻止 setUp() 为 python 测试用例中的每个测试方法启动浏览器?
    我正在练习编写Web自动化测试用例,并且编写了一些函数来测试登录、在用户主页中查找我的用户名以及测试GitHub的注销功能。然而,我通过经验和阅读了解到setUp()是在每个测试方法之前启动的,而我的问题是在每个测试方法之前它都会打开一个新的浏览器。我希望我的所有测......
  • 尝试使用Python抓取需要先登录的网站但没有成功
    我正在尝试抓取一个需要登录的网站(我的路由器GUI),但无论我做了什么,我都会反复返回登录站点的源代码,而不是成功登录后出现的页面。我做了一些阅读,并意识到我需要返回POST请求的答案。我想我找到了它们并返回了所需的值,但仍然-似乎没有任何效果。我使用https://curl.tri......
  • 给python初学者的一些建议
    写在开篇关于Python,可以这么说,这几年借着数据科学、机器学习与人工智能的东风,Python老树开新花,在风口浪尖上居高不下。Python之所以这么受大家的青睐,是因为它语言简洁,上手容易,让非计算机专业的人员也能快速上手,享受编程开发带来的便利和福利。但Python再简单,它也是一......