我已经在互联网上进行搜索,但到目前为止我找不到答案。
我有一个库,每隔一个文件导入一次。
假设该库被导入为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__
答案 0 :(得分:2)
在要导入的文件中,您可以检查堆栈并获取不以<
开头的帧中的第一个文件名(跳过第一个帧(当前帧)后)。内部库:
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])