Есть ли способ заставить Python игнорировать любой. pyc-файлы, которые присутствуют и всегда интерпретируют весь код (включая импортированные модули) напрямую? Google не получил никаких ответов, так что я подозреваю, что нет, но, похоже, стоило спросить на всякий случай.
(Почему я хочу это сделать? У меня есть большой конвейер скриптов Python, которые многократно запускаются в кластере. из нескольких сотен компьютеров. Сами скрипты Python живут в общей файловой системе NFS. Почему-то, редко, после того, как их запускали сотни раз в течение нескольких часов, они внезапно начинают аварийно завершать работу с ошибкой из-за невозможности импортировать модуль. Регенерация файла .pyc устраняет проблему. Я хочу, конечно, устранить основные причины, но в то же время нам также нужно, чтобы система продолжала работать, поэтому, если возможно, игнорирование файлов .pyc будет разумный обходной путь).
PS I ' я использую Python 2.5, поэтому я не могу использовать -B.
Вы можете использовать модуль imp стандартной библиотеки Python для реализации __builtins__. __import__
, который является хук-функцией, вызываемой операторами import
и from
. В частности, функция imp.load_module может быть использована для загрузки .py
даже при наличии соответствующего .pyc
. Обязательно внимательно изучите всю документацию на странице, на которую я указал, а также документацию по import, поскольку это довольно тонкая работа. Сами документы предлагают использовать вместо этого хуки импорта (согласно PEP 302), но для этой конкретной задачи, я подозреваю, это будет еще сложнее.
BTW, вероятные причины наблюдаемых вами проблем включают условия гонки между различными компьютерами, пытающимися записать .pyc
файлы в одно и то же время - блокировка NFS, как известно, нестабильна и всегда была такой;-). Пока все компиляторы Python, которые вы используете, имеют одну и ту же версию (если нет, то у вас будут большие проблемы;-), я бы предпочел предварительно скомпилировать все эти .py
файлы в .pyc
и сделать их каталоги доступными только для чтения; последнее кажется самым простым подходом в любом случае (вместо взлома __import__
), даже если по какой-то причине вы не можете предварительно скомпилировать.
Возможно, вы могли бы обойти это, например, запланировав задание для периодического выключения скриптов и удаления файлов .pyc.
Это не совсем то, что вы просили, но может ли удалить существующие файлы .pyc, а затем не создавать для вас больше работы? В этом случае вы можете использовать параметр -B:
>python --help
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-B : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x
Ну, я не думаю, что Python когда-либо интерпретирует код напрямую, если вы загружаете код из файла. Даже при использовании интерактивной оболочки Python компилирует импортированный модуль в .pyc.
Учитывая это, вы можете написать сценарий оболочки, который будет удалять все файлы .pyc перед запуском ваших сценариев. Это, конечно, заставит полностью перестраивать систему перед каждым выполнением.
Начиная с Python 3.2, вы можете найти PEP 3147 - PYC Repository Directories, представляющий большой интерес.