Безопасно ли удалять все файлы python *.pyc для принудительного использования нового кода?

TL;DR

  • Безопасно ли выбирать все *.pyc (что соответствует *.py файл) файлы и удалить их, чтобы заставить использование нового кода?
  • Есть ли способ найти и перекомпилировать все .py файлы, найденные на диске при перезаписи существующих .pyc файлы?

У меня проблема с пользовательским пакетом Python, который был обновлен.

После обновления (заменили старое .py файлы с новым .py файлы) я заметил, что при импорте пакета - старый скомпилированный код (хранится как *.pyc ссылки на файлы) вместо нового кода (лежащего в .py файлы).

Когда я обновляю пакет, мне нужно "очистить кеш" (удаляя все эти pyc-файлы, надеюсь, они будут инициализироваться лениво при первом использовании). В качестве хака я подумал об удалении всех файлов, найденных на диске, соответствующих *.pyc суффикс (соответствующий *.py файл) и перезагрузка машины

Кроме того, есть ли способ найти и перекомпилировать все .py файлы, найденные на диске при перезаписи существующих .pyc файлы?

1 ответ

Решение

Первый подход,

Используйте следующий скрипт Python, который удаляет *.pyc файлы, которые имеют соответствующие *.py файл

python-cache-flusher.py (вы можете раскошелиться на github):

#!/usr/bin/env python

import fnmatch
import os
import sys


def get_valid_pyc_files():
    for import_path in sys.path:
        for root, dir_names, file_names in os.walk(import_path):
            for file_name in fnmatch.filter(file_names, '*.pyc'):
                pyc_file_path = os.path.join(root, file_name)
                py_file_path = pyc_file_path[:-1]

                if os.path.isfile(py_file_path):
                    yield pyc_file_path


def ensure_root():
    is_root = os.geteuid() == 0
    if not is_root:
        sys.exit('Must be run as root')


def main():
    ensure_root()

    for pyc_file_path in get_valid_pyc_files():
        print 'removing', pyc_file_path
        os.remove(pyc_file_path)


if __name__ == '__main__':
    main()

Второй подход,

Вы можете использовать встроенный compileall модуль (как указано в комментариях). Например, вот как перекомпилировать путь импорта Python по умолчанию:

sudo python -m compileall `python -c "import sys; print ' '.join(sys.path)"`
Другие вопросы по тегам