Подтвердить что ты не робот

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

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

Есть ли способ заставить python не использовать "потерянные".pyc файлы или печатать предупреждение при их использовании?
В качестве альтернативы, факт, что у меня есть эта проблема, означает, что я делаю что-то неправильно, и если да, то что?

4b9b3361

Ответ 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 (особенно коммерчески лицензированные) распространяются только как скомпилированный байт-код.