Отслеживание того, когда модули Python импортируются - PullRequest
0 голосов
/ 06 июня 2019

Сохраняет ли интерпретатор временную метку, когда модуль импортируется?Или есть простой способ подключиться к механизму импорта, чтобы сделать это?

Сценарий - это длительный процесс Python, который в различные моменты импортирует предоставленные пользователем модули.Я хотел бы, чтобы процесс мог проверять, "должен ли я перезапустить загрузку последних изменений кода?"путем проверки временных меток файла модуля в зависимости от времени импорта модуля.

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Вот способ автоматического добавления атрибута (с именем _loadtime в приведенном ниже примере кода) к модулям при их импорте. Код основан на рецепте 10.12 под названием «Исправление модулей при импорте» в книге Дэвида Бизли и Брайана Джоунса, 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__':

    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
0 голосов
/ 06 июня 2019

Я не думаю, что есть какой-то способ обойти это хакерство, но как насчет чего-то подобного каждый раз, когда вы импортируете? (Я не знаю точно, как вы импортируете):

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

И затем вы можете обратиться к этому словарю аналогичным образом позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...