Безопасно ли удалять все файлы 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)"`