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



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

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

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

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

最新更新