【问题标题】:Get name from python file which called the import从调用导入的python文件中获取名称
【发布时间】:2019-02-18 01:44:32
【问题描述】:

我已经在互联网上搜索过,但到目前为止我找不到答案。

我有一个在其他文件中导入的库。 假设库被导入为import my_lib 在使用它的文件中。

在 mylib 中,我想做类似__imported_from__ 的操作,以便代码知道导入的来源。我需要这个来记录日志(不同的调用不同的日志文件/日志名)

这将是此刻的日志:

2018-09-13 01:36:00,921 - my_lib - INFO - Start Processing
2018-09-13 01:36:30,921 - my_lib - INFO - Done Processing
2018-09-13 01:37:00,921 - my_lib - INFO - Start Processing
2018-09-13 01:37:30,921 - my_lib - INFO - Done Processing

我希望 my_lib 包含导入文件中的名称,以便可以在我的日志记录中查看调用的来源。像下面的例子

2018-09-13 01:36:00,921 - import_from_file_1 - INFO - Start Processing
2018-09-13 01:36:30,921 - import_from_file_1 - INFO - Done Processing
2018-09-13 01:37:00,921 - import_from_file_2 - INFO - Start Processing
2018-09-13 01:37:30,921 - import_from_file_2 - INFO - Done Processing

根据答案,我写了 2 行来提供我想要的数据:

import inspect
from os.path import basename, splitext
imported_from_file = (inspect.stack()[1][1]) if __name__ != '__main__' else False
used_from = splitext(basename(imported_from_file))[0] if imported_from_file else __name__

【问题讨论】:

  • 代码的行为不应因被调用/导入/加载的位置而有所不同
  • 在我的日志文件中只是一个不同的字符串。添加了一个示例。
  • 那么你只是想在日志中包含一个堆栈跟踪(可能很简略)...?

标签: python python-2.7 python-import


【解决方案1】:

在正在导入的文件中,您可以检查堆栈并获取不以<开头的帧中的第一个文件名(跳过第一帧,即当前帧之后),表示内部库:

import inspect
if __name__ != '__main__':
    for frame in inspect.stack()[1:]:
        if frame.filename[0] != '<':
            print(frame.filename)
            break

如果您使用的是 Python 2.7,则应改为使用帧元组的第二项。事实上,在 Python 2.7 中,进行导入的模块总是在第二帧,所以你可以简单地这样做:

import inspect
if __name__ != '__main__':
    print(inspect.stack()[1][1])

【讨论】:

  • 这给出了错误:AttributeError: 'tuple' object has no attribute 'filename' 当我尝试 frame[0].filename: AttributeError: 'frame' object has no attribute 'filename' 所以我'我已经卡住了。但是,如果这会导致我需要的东西,那么值得一试。
  • 我已经用 Python 2.7 兼容的代码更新了我的答案。
  • 这应该可以。如果我去掉扩展名和路径的第一部分,只留下名字。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-04-22
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
相关资源
最近更新 更多