Faire ignorer Python.fichiers pyc
y a-t-il un moyen pour que Python en ignore un .les fichiers pyc qui sont présents et interprètent toujours tout le code (y compris les modules importés) directement? Google n'a pas trouvé de réponses, donc je soupçonne que non, mais il a semblé intéressant de demander juste au cas.
(Pourquoi ai-je envie de faire? J'ai un grand pipeline de scripts Python qui sont lancés à plusieurs reprises sur un groupe de quelques centaines d'ordinateurs. Les scripts Python eux-mêmes vivent sur un système de fichiers NFS partagé. D'une façon ou d'une autre, rarement, après avoir parcouru des centaines de fois pendant plusieurs heures, ils vont recommencer à s'écraser avec une erreur de ne pas pouvoir importer un module. Forcer la régénération de l' .pyc fichier résout le problème. Je veux, bien sûr, corriger les causes sous-jacentes, mais en attendant, nous avons également besoin du système pour continuer à fonctionner, il semble donc ignorer le .fichiers pyc si possible serait une solution raisonnable).
P.S. j'utilise Python 2.5, donc je ne peux pas utiliser-B.
6 réponses
Vous utilisez le module imp de la bibliothèque standard de Python pour réimposer __builtins__.__import__
, qui est la fonction hook appelée par import
et from
déclaration. En particulier, le imp.load_module fonction peut être utilisée pour charger un .py
même si le.pyc
est présent. Assurez-vous d'étudier attentivement tous les docs dans la page que j'ai indiqué, plus ceux pour importer, comme c'est un travail délicat. Doc eux-mêmes suggèrent d'utiliser des crochets d'importation à la place (selon PEP 302), mais pour cette tâche particulière je soupçonne que ce serait encore plus difficile.
BTW, les causes probables de vos problèmes observés comprennent les conditions de course entre les différents ordinateurs essayant d'écrire .pyc
fichiers en même temps, le verrouillage NFS est notoirement capricieux et a toujours été;-). Aussi longtemps que tous les compilateurs Python que vous utilisez sont dans la même version (sinon, vous avez de gros problèmes de toute façon;-), je préfère précompiler tous ces .py
fichiers dans .pyc
et de faire lire leurs répertoires en lecture seule; ce dernier semble de toute façon l'approche la plus simple (plutôt que de hacker __import__
), même si pour une raison quelconque vous ne pouvez pas précompiler.
Ce n'est pas exactement ce que vous avez demandé, mais serait dépose de l'existant .fichiers pyc et ensuite ne pas créer plus de travail pour vous? Dans ce cas, vous pouvez utiliser l'option-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
si quelqu'un utilise python 2.6 ou plus avec la même question, la chose la plus simple à faire est:
- supprimer tout .fichiers pyc
- exécutez tous vos interprètes python avec le
-B
option, donc ils ne généreront pas .fichiers pyc.
Dans la doc:
- B S'il est donné, Python n'essaiera pas d'écrire .pyc ou .fichiers pyo sur l'importation de modules source. Voir aussi PYTHONDONTWRITEBYTECODE.
nouveau dans la version 2.6.
Si vous ne pouvez pas supprimer toutes les .pycs, vous pouvez:
1) Exécutez tous vos interprètes python avec le -B -O
options.
ceci dira à python de chercher .fichiers pyo pour bytecode au lieu de .fichiers pyc (-O
) et dites à python de ne pas générer de fichiers bytecode (-B
).
la combinaison des deux options, en supposant que vous ne les avez pas utilisées auparavant, est que Python ne générera pas de fichiers bytecode et ne cherchera pas bytecode des fichiers qui auraient été générés par des versions plus anciennes.
Dans la doc:
- B S'il est donné, Python n'essaiera pas d'écrire .pyc ou .fichiers pyo sur l'importation de modules source. Voir aussi PYTHONDONTWRITEBYTECODE.
Nouveau dans la version 2.6.
-O Activez les optimisations de base. Cela modifie l'extension du nom de fichier pour les fichiers compilés (bytecode).pyc .pyo. Voir aussi PYTHONOPTIMIZE.
peut-être pourriez-vous contourner cela, par exemple, en programmant un travail pour arrêter périodiquement les scripts et supprimer les .fichiers pyc.
Eh bien, Je ne pense pas que Python interprète jamais le code directement si vous chargez le code à partir d'un fichier. Même en utilisant le shell interactif, Python compilera le module importé dans un .pyc.
cela dit, Vous pouvez écrire un script shell pour aller de l'avant et supprimer tous les .fichiers pyc avant de lancer vos scripts. Cela forcerait certainement une reconstruction complète avant chaque exécution.
Vous pouvez trouver PEP 3147-répertoires des dépôts PYC pour être d'un grand intérêt de Python 3.2 partir.