Заставить Python игнорировать файлы .pyc

Есть ли способ заставить Python игнорировать любой. pyc-файлы, которые присутствуют и всегда интерпретируют весь код (включая импортированные модули) напрямую? Google не получил никаких ответов, так что я подозреваю, что нет, но, похоже, стоило спросить на всякий случай.

(Почему я хочу это сделать? У меня есть большой конвейер скриптов Python, которые многократно запускаются в кластере. из нескольких сотен компьютеров. Сами скрипты Python живут в общей файловой системе NFS. Почему-то, редко, после того, как их запускали сотни раз в течение нескольких часов, они внезапно начинают аварийно завершать работу с ошибкой из-за невозможности импортировать модуль. Регенерация файла .pyc устраняет проблему. Я хочу, конечно, устранить основные причины, но в то же время нам также нужно, чтобы система продолжала работать, поэтому, если возможно, игнорирование файлов .pyc будет разумный обходной путь).

PS I ' я использую Python 2.5, поэтому я не могу использовать -B.

22
задан Ryan Gabbard 17 August 2010 в 15:28
поделиться

5 ответов

Вы можете использовать модуль imp стандартной библиотеки Python для реализации __builtins__. __import__, который является хук-функцией, вызываемой операторами import и from. В частности, функция imp.load_module может быть использована для загрузки .py даже при наличии соответствующего .pyc. Обязательно внимательно изучите всю документацию на странице, на которую я указал, а также документацию по import, поскольку это довольно тонкая работа. Сами документы предлагают использовать вместо этого хуки импорта (согласно PEP 302), но для этой конкретной задачи, я подозреваю, это будет еще сложнее.

BTW, вероятные причины наблюдаемых вами проблем включают условия гонки между различными компьютерами, пытающимися записать .pyc файлы в одно и то же время - блокировка NFS, как известно, нестабильна и всегда была такой;-). Пока все компиляторы Python, которые вы используете, имеют одну и ту же версию (если нет, то у вас будут большие проблемы;-), я бы предпочел предварительно скомпилировать все эти .py файлы в .pyc и сделать их каталоги доступными только для чтения; последнее кажется самым простым подходом в любом случае (вместо взлома __import__), даже если по какой-то причине вы не можете предварительно скомпилировать.

13
ответ дан 29 November 2019 в 05:18
поделиться

Возможно, вы могли бы обойти это, например, запланировав задание для периодического выключения скриптов и удаления файлов .pyc.

0
ответ дан 29 November 2019 в 05:18
поделиться

Это не совсем то, что вы просили, но может ли удалить существующие файлы .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
12
ответ дан 29 November 2019 в 05:18
поделиться

Ну, я не думаю, что Python когда-либо интерпретирует код напрямую, если вы загружаете код из файла. Даже при использовании интерактивной оболочки Python компилирует импортированный модуль в .pyc.

Учитывая это, вы можете написать сценарий оболочки, который будет удалять все файлы .pyc перед запуском ваших сценариев. Это, конечно, заставит полностью перестраивать систему перед каждым выполнением.

0
ответ дан 29 November 2019 в 05:18
поделиться

Начиная с Python 3.2, вы можете найти PEP 3147 - PYC Repository Directories, представляющий большой интерес.

0
ответ дан 29 November 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: