Есть ли способ очистить кэш байт-кода Python? - PullRequest
4 голосов
/ 12 января 2011

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

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

Спасибо!

Ответы [ 4 ]

8 голосов
/ 12 января 2011

Реимпортировать модули сложно, чтобы правильно настроить все граничные случаи. В документации для reload упоминаются некоторые из них. В зависимости от того, что вы тестируете, вы можете выиграть, протестировав импорт с отдельными вызовами интерпретатора, запустив каждый из них, скажем, через подпроцесс . Это, вероятно, будет медленнее, но также, вероятно, более безопасным и более точным тестированием.

4 голосов
/ 12 января 2011

Использование reload().

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

Однако модуль должен быть уже загружен. Обходной путь должен обработать получающееся NameError:

try:
    reload(math)
except NameError:
    import math
3 голосов
/ 12 января 2011

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

В качестве альтернативы, вы можете ударить 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]
0 голосов
/ 10 февраля 2017

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

...