python - 从调用导入的 python 文件中获取名称

标签 python python-2.7 python-import

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

我有一个库,它被导入到所有其他文件中。 假设该库被导入为 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

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

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__

最佳答案

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

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])

关于python - 从调用导入的 python 文件中获取名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52311738/

相关文章:

python - 如果一直不需要模块,导入模块的最佳方法是什么?

python - 无法在 Python3 中导入 sqlite3

python - 如何在python中导入仅包含某些字符串的 "dat"文件

python - 如何根据 FastApi 中的另一个查询参数使查询参数成为必需的?

python - 高斯滤波opencv_python报错

google-app-engine - 使用 pytz 时,我得到 'ZZ' 作为国家代码

python - 在 python 中,为什么要从内置模块导入 'object'?

python - python 查找重复行

python - 新版本的 Django 中 DateModifierNode 的替代品是什么

python-2.7 - Django Meta Class - 将排序应用于用户的模型字段