解释器是否以某种方式保留导入模块的时间戳?还是有一种简单的方法可以挂接到导入机制中来做到这一点?
该场景是一个长期运行的Python进程,该进程在各个点上都导入用户提供的模块。我希望该过程能够检查“我是否应该重新启动以加载最新的代码更改?”通过对照导入模块的时间检查模块文件的时间戳。
答案 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))
然后您可以稍后以类似方式引用此词典。