2016-06-07 2 views
2

pyc Les fichiers ont été la cause de chagrins dans le passé et j'ai récemment vu quelques articles sur la façon d'empêcher python de les générer. Actuellement, nous exécutons simplement un script pour les nettoyer après tout changement de code pour s'assurer que les nouveaux sont générés, mais il serait beaucoup plus facile de les désactiver en général. Y a-t-il des effets secondaires à leur désactivation dans notre environnement de production dont je ne suis peut-être pas au courant? Quels sont les inconvénients de faire cela?Désactivation des fichiers pyc en production

Le seul vrai problème que nous rencontrons est parfois les fichiers deviennent obsolètes causant des erreurs d'importation et est difficile à déboguer après un refactor massif. Une fois que vous vous rendez compte que c'est un problème de pyc, c'est une solution assez simple, exécutez simplement le script, mais cette réalisation pourrait venir 30 minutes plus tard sur la route du débogage.

+0

Pouvez-vous décrire les problèmes que vous rencontrez avec eux un peu plus en détail? Il peut y avoir une meilleure option que juste les désactiver. – skrrgwasme

+0

Copie possible de [Comment éviter les fichiers .pyc?] (Http: // stackoverflow.com/questions/154443/how-to-avoid-pyc-files) –

Répondre

2

La désactivation de l'écriture et de l'utilisation du bytecode compilé s'accompagne d'un coût de performance au démarrage: votre code Python est chargé en mémoire lors de la génération du processus et les fichiers non-.pyc/.pyo fichier importé au démarrage. Si vous supprimez actuellement tous les fichiers .pyc et .pyo de votre répertoire de code et de vos importations, vous êtes déjà en train de forcer une version de ce fichier.

Je suis curieux de savoir où ils ont causé la douleur dans le passé (vous désactivez fois modifiés sur le système de fichiers?) Comme si le fichier est .py plus récent que le fichier .pyc, l'interpréteur Python (au moins en commun implémentations, y compris CPython), recompilera la source, mais ce n'est pas très important pour la portée de cette question.

Si vous importez derrière une fonction, par exemple .:

def my_database_call(budget_id): 
    import some_expensive_module_to_import 
    some_orm(...).get(budget_id) 

qui importent le coût ne sera pas engagée tant que cette fonction est appelée (et peut-être, à chaque fois après aussi). Ce n'est pas si différent que si vous deviez autoriser le bytecode (.pyc ou les fichiers "optimisés" .pyo), mais au moins dans ce cas, vous payez une seule fois ce prix import/parse/compile. Dans le cas où vous avez évoqué les commentaires, si vous envoyez un script Python au système d'exploitation et que vous n'autorisez pas l'écriture du bytecode dans cet appel, chaque appel entraîne le prix de la compilation.

+0

Parfois, ils ne sont pas recompilés après avoir vérifié le nouveau code avec Git. Il peut parfois s'agir d'un problème de débogage majeur que les fichiers 'pyc' sont à l'origine de ces erreurs d'importation. Surtout après des refacteurs massifs. – electrometro

+0

Ah, d'accord, je peux voir cela se produire. La principale modification si vous n'autorisez pas l'écriture de fichiers bytecode sera une augmentation du temps de démarrage. Cela peut être très important si votre application génère une exception dans la production et que vous comptez sur elle pour redémarrer. –

+0

Comment cet effet utiliser 'popen' pour exécuter un script python? Nous le faisons très souvent. – electrometro

2

Vous pouvez essayer d'ajouter le code suivant à votre fichier principal. Tout module importé après ne crée pas un .pyc:

import sys 
sys.dont_write_bytecode=True 

Ou définir la variable d'environnement:

PYTHONDONTWRITEBYTECODE 

Vous pouvez également modifier ou créer votre usercustomize.py trouvé dans /site-packages contenir:

import sys 
sys.dont_write_bytecode=True 

Peut également passer l'option "-B". En ce qui concerne la suppression ou la désactivation de la génération .pyc, les répercussions semblent minimes ou indiscernables. Le fichier .pyc est généré pour améliorer la vitesse. Pas la vitesse d'un programme mais la quantité de temps qu'il faut pour charger. Si vous êtes constamment importing un module, un .pyc est recommandé car il réduit le temps de chargement desdits modules. Lors de la recherche, il semble qu'il n'y ait aucun autre avantage à utiliser/générer .pyc.

+0

Je suis familier avec la façon de les désactiver, mais je cherche quels sont les effets secondaires potentiels de le faire. – electrometro

+0

@electrometro Mis à jour. – TheLazyScripter