跟踪何时导入Python模块

时间:2019-06-05 21:04:47

标签: python python-3.x module

解释器是否以某种方式保留导入模块的时间戳?还是有一种简单的方法可以挂接到导入机制中来做到这一点?

该场景是一个长期运行的Python进程,该进程在各个点上都导入用户提供的模块。我希望该过程能够检查“我是否应该重新启动以加载最新的代码更改?”通过对照导入模块的时间检查模块文件的时间戳。

2 个答案:

答案 0 :(得分:1)

这是一种在导入模块时自动将属性(在下面的示例代码中命名为_loadtime)添加到模块的方法。该代码基于David Beazley和Brian Jones在2013年O'Reilly撰写的 Python Cookbook 一书中标题为“导入时的修补模块”的食谱10.12,其中展示了我已修改的技术你想要什么。

出于测试目的,我创建了这个简单的target_module.py文件:

print('in target_module')

这是示例代码:

import importlib
import sys
import time


class PostImportFinder:
    def __init__(self):
        self._skip = set()  # To prevent recursion.

    def find_module(self, fullname, path=None):
        if fullname in self._skip:  # Prevent recursion
            return None
        self._skip.add(fullname)
        return PostImportLoader(self)


class PostImportLoader:
    def __init__(self, finder):
        self._finder = finder

    def load_module(self, fullname):
        importlib.import_module(fullname)
        module = sys.modules[fullname]

        # Add a custom attribute to the module object.
        module._loadtime = time.time()

        self._finder._skip.remove(fullname)
        return module


sys.meta_path.insert(0, PostImportFinder())

if __name__ == '__main__':

    try:
        print('importing target_module')
        import target_module
    except Exception as e:
        print('Import failed:', e)
        raise

    print('module loadtime: {}'.format(target_module._loadtime))

输出:

importing target_module
in target_module
module loadtime: 1559786183.3686578

答案 1 :(得分:0)

我不认为有什么办法可以解决这个问题,但是每次导入时都这样吗? (我不知道您要如何导入):

import time
from types import ModuleType

# create a dictionary to keep track
# filter globals to exclude things that aren't modules and aren't builtins 
MODULE_TIMES = {k:None for k,v in globals().items() if not k.startswith("__") and not k.endswith("__") and type(v) == ModuleType}


for module_name in user_module_list:
    MODULE_TIMES[module_name] = time.time()
    eval("import {0}".format(module_name))

然后您可以稍后以类似方式引用此词典。