Как предотвратить использование python для использования потерянных файлов .pyc? (те, у которых нет соответствующих файлов .py)
Время от времени я сталкиваюсь с очень трудной для отладки проблемой: там находится оставшийся .pyc файл где-то в моем $PYTHONPATH, а соответствующий .py файл перемещен в другое место, что позже в $PYTHONPATH - так когда я пытаюсь импортировать модуль, используется "потерянный".pyc файл, и все изменения в "реальном".py файле игнорируются, оставляя меня невероятно смущенным, пока я не выясню, что происходит.
Есть ли способ заставить python не использовать "потерянные".pyc файлы или печатать предупреждение при их использовании?
В качестве альтернативы, факт, что у меня есть эта проблема, означает, что я делаю что-то неправильно, и если да, то что?
Ответы
Ответ 1
Попробуйте (см. здесь):
PYTHONDONTWRITEBYTECODE
Если это установлено, Python не пытается писать файлы .pyc
или .pyo
при импорте исходных модулей. Это эквивалентно указав опцию -B
.
Новое в версии 2.6.
Но есть одна проблема, связанная с этим: вы потеряете преимущество наличия .pyc
файлов (таким образом, теряя производительность). Лучший, более чистый и дружелюбный способ - пройти по каталогу и очистить осиротевшие .pyc
файлы, которые вам не нужны. Вы должны сделать это с помощью script и убедитесь, что у вас нет файлов .pyc
, которые не предназначены для связи с .py
(например, для некоторого уровня обфускации).
Ответ 2
Вы не можете запретить Python загружать файлы .pyc, если он находит их в этом пути, нет.
У вас есть несколько вариантов:
-
Импортируйте нарушительный модуль и выясните, что это за путь:
>>> import borkenmod
>>> import sys
>>> sys.modules[borkenmod.__name__].__file__
'lib/python2.7/borkenmod.pyc'
-
Используйте script, чтобы пройти PYTHONPATH и удалить устаревшие файлы байт-кода. Связанный script удаляет все .pyc
файлы, для которых нет соответствующего файла .py
.
-
Протрите все .pyc файлы в PYTHONPATH и перезапустите Python с помощью compileall
модуля:
python -m compileall [path]
затем удалите этот файл.
Обратите внимание, что последние два параметра могут привести к удалению законных модулей python! Некоторые модули python (особенно коммерчески лицензированные) распространяются только как скомпилированный байт-код.