Есть ли в любом случае, чтобы очистить кеш байтона Python?

StackOverflow https://stackoverflow.com/questions/4664438

  •  10-10-2019
  •  | 
  •  

Вопрос

Каждый модульный тест, который я запускаю, - это писать код Python в файл, а затем импортировать его в качестве модуля. Проблема в том, что код изменяется, но дальнейшие операторы импорта не изменяют модуль.

Я думаю, что мне нужен способ, чтобы эфир заставил перезагрузить модуль или очистить внутренний кэш байт -кодов. Любые идеи?

Спасибо!

Это было полезно?

Решение

Модули ReimPorting сложно правильно понять все края. Документация для перезагрузить упоминает некоторые из них. В зависимости от того, что вы тестируете, вы май Будьте лучше, тестируя импорт с отдельными вызовами интерпретатора, запустив каждый через, скажем, подпроцесс. Анкет Вероятно, это будет медленнее, но также, вероятно, более безопасным и более точным тестированием.

Другие советы

Использовать reload().

Перезагрузить ранее импортированный модуль. Аргумент должен быть объектом модуля, поэтому он должен был быть успешно импортирован ранее. Это полезно, если вы отредактировали исходный файл модуля с помощью внешнего редактора и хотите попробовать новую версию, не покидая интерпретатора Python. Возвращаемое значение - это объект модуля (такой же, как аргумент модуля).

Тем не менее, модуль должен быть уже загружен. Обходной путь - это справиться с полученным NameError:

try:
    reload(math)
except NameError:
    import math

Напишите свой код в модулях с разными названием. Написание нового кода в существующий файл и попытка импортировать его снова не будет хорошо работать.

В качестве альтернативы, вы можете клоббер sys.modules. Анкет Например:

class MyTestCase(unittest.TestCase):
    def setUp(self):
        # Record sys.modules here so we can restore it in tearDown.
        self.old_modules = dict(sys.modules)

    def tearDown(self):
        # Remove any new modules imported during the test run. This lets us
        # import the same source files for more than one test.
        for m in [m for m in sys.modules if m not in self.old_modules]:
            del sys.modules[m]

Столкнулся с подобной ситуацией. Позже обнаружил, что методика отступления в белом пространстве использовала вопросы. Особенно на платформах Windows убедитесь, что единая техника адаптирована по всему модулю, т.е. Используйте либо вкладку, либо вкладку исключительно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top