跟踪何时导入Python模块
解释器是否以某种方式保留了导入模块的时间戳?或者有没有一种简单的方法可以连接到进口机器上跟踪何时导入Python模块,python,python-3.x,module,Python,Python 3.x,Module,解释器是否以某种方式保留了导入模块的时间戳?或者有没有一种简单的方法可以连接到进口机器上 该场景是一个长期运行的Python进程,它在不同点导入用户提供的模块。我希望流程能够通过检查模块文件的时间戳和导入模块的时间戳来检查“我是否应该重新启动以加载最新的代码更改?”我不认为有任何方法可以避免这有多骇客,但是每次导入时这样的事情怎么样?(我不知道您是如何导入的): 然后你以后可以用类似的方式引用这本词典 我不认为有什么办法可以避免这有多骇客,但是每次你导入这样的东西怎么样?(我不知道您是如何导入的
该场景是一个长期运行的Python进程,它在不同点导入用户提供的模块。我希望流程能够通过检查模块文件的时间戳和导入模块的时间戳来检查“我是否应该重新启动以加载最新的代码更改?”我不认为有任何方法可以避免这有多骇客,但是每次导入时这样的事情怎么样?(我不知道您是如何导入的):
然后你以后可以用类似的方式引用这本词典 我不认为有什么办法可以避免这有多骇客,但是每次你导入这样的东西怎么样?(我不知道您是如何导入的):
然后你以后可以用类似的方式引用这本词典 下面是一种在导入模块时自动将属性(在下面的示例代码中名为
\u loadtime
)添加到模块中的方法。代码基于配方10.12,标题为“导入时修补模块”,这是由David Beazley和Brian Jones,O'Reilly于2013年出版的Python Cookbook一书中的内容,该书展示了一种我适应于做你想做的事情的技术
出于测试目的,我创建了这个简单的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__':
import time
try:
print('importing target_module')
import target_module
except Exception as e:
print('Import failed:', e)
raise
loadtime = time.localtime(target_module._loadtime)
print('module loadtime: {} ({})'.format(
target_module._loadtime,
time.strftime('%Y-%b-%d %H:%M:%S', loadtime)))
样本输出:
导入目标\u模块
在目标模块中
模块加载时间:1604683023.2491636(2020-11-06 09:17:03)
以下是一种在导入模块时自动将属性(在下面的示例代码中名为\u loadtime
)添加到模块中的方法。代码基于配方10.12,标题为“导入时修补模块”,这是由David Beazley和Brian Jones,O'Reilly于2013年出版的Python Cookbook一书中的内容,该书展示了一种我适应于做你想做的事情的技术
出于测试目的,我创建了这个简单的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__':
import time
try:
print('importing target_module')
import target_module
except Exception as e:
print('Import failed:', e)
raise
loadtime = time.localtime(target_module._loadtime)
print('module loadtime: {} ({})'.format(
target_module._loadtime,
time.strftime('%Y-%b-%d %H:%M:%S', loadtime)))
样本输出:
导入目标\u模块
在目标模块中
模块加载时间:1604683023.2491636(2020-11-06 09:17:03)
您可以在每次更改时增加模块版本号,然后检查版本号,例如,foo.\uuuu version\uuuuuu
?对于您可以控制的模块-听起来像是这样-您不能在模块(或包)中加入某种版本属性并检查?@martineau包括版本号,版本应在\uuuu version\uuuu
属性中可用。“您可以在每次更改时增加模块版本号,然后检查版本号,例如,foo.\uuuuuu version\uuuuuu
?对于您可以控制的模块-听起来像是这样-您不能在模块中加入某种版本属性并检查?@martineau“当模块(或包)包含版本号时,该版本应该在\uuuuu version\uuu
属性中可用。”