Puis-je exécuter l'interpréteur python sans générer les fichiers .pyc compilés?
268
De "Quoi de neuf dans Python 2.6 - Modifications de l'interpréteur" :
Python peut désormais être empêché d'écrire des fichiers .pyc ou .pyo en fournissant le commutateur -B à l'interpréteur Python ou en définissant la variable d'environnement PYTHONDONTWRITEBYTECODE avant d'exécuter l'interpréteur. Ce paramètre est disponible pour les programmes Python en tant que
sys.dont_write_bytecode
variable, et le code Python peut changer la valeur pour modifier le comportement de l'interpréteur.
Mise à jour 2010-11-27: Python 3.2 résout le problème d'encombrement des dossiers source avec des .pyc
fichiers en introduisant un __pycache__
sous-dossier spécial , voir Nouveautés de Python 3.2 - Répertoires de référentiel PYC .
export PYTHONDONTWRITEBYTECODE=1
la source
site-packages/usercustomize.py
pour que cela s'applique à tous vos scripts. Pour moi, ce répertoire était$HOME/.local/lib/python2.6/site-pacakges/usercustomize.py
. Cf. docs.python.org/2/tutorial/…import sys; sys.dont_write_bytecode = True
Il existe en fait un moyen de le faire dans Python 2.3+, mais c'est un peu ésotérique. Je ne sais pas si vous vous en rendez compte, mais vous pouvez faire ce qui suit:
Selon la bibliothèque zipimport :
Ainsi, tout ce que vous avez à faire est de compresser les fichiers, d'ajouter le fichier zip à votre sys.path puis de les importer.
Si vous construisez cela pour UNIX, vous pouvez également envisager de compresser votre script à l'aide de cette recette: exécutable zip unix , mais notez que vous devrez peut-être le modifier si vous prévoyez d'utiliser stdin ou de lire quoi que ce soit à partir de sys.args (cela PEUT être sans trop de peine).
D'après mon expérience, les performances ne souffrent pas trop à cause de cela, mais vous devriez réfléchir à deux fois avant d'importer de très gros modules de cette façon.
la source
En 2.5, il n'y a aucun moyen de le supprimer, à part des mesures comme ne pas donner aux utilisateurs un accès en écriture au répertoire.
En python 2.6 et 3.0 cependant, il peut y avoir un paramètre dans le module sys appelé "dont_write_bytecode" qui peut être défini pour supprimer cela. Cela peut également être défini en passant l'option "-B" ou en définissant la variable d'environnement "PYTHONDONTWRITEBYTECODE"
la source
Vous pouvez définir
sys.dont_write_bytecode = True
votre source, mais cela devrait être dans le premier fichier python chargé. Si vous exécutez,python somefile.py
vous n'obtiendrez passomefile.pyc
.Lorsque vous installez un utilitaire à l'aide
setup.py
etentry_points=
vous aurez définisys.dont_write_bytecode
dans le script de démarrage. Vous ne pouvez donc pas vous fier au script de démarrage "par défaut" généré par setuptools.Si vous démarrez vous-même Python avec un fichier python comme argument, vous pouvez spécifier
-B
:somefile.pyc
ne serait pas généré de toute façon, mais aucun.pyc
fichier pour les autres fichiers importés aussi.Si vous avez un utilitaire
myutil
et que vous ne pouvez pas le changer, il ne passera pas -B à l'interpréteur python. Il suffit de le démarrer en définissant la variable d'environnementPYTHONDONTWRITEBYTECODE
:la source
J'ai plusieurs cas de test dans une suite de tests et avant d'exécuter la suite de tests dans le terminal Mac comme ceci:
En exécutant la commande de cette façon, mon répertoire était rempli de fichiers .pyc. J'ai essayé la méthode indiquée ci-dessous et cela a résolu le problème:
Cette méthode fonctionne si vous importez des cas de test dans la suite de tests et exécutez la suite sur la ligne de commande.
la source
À partir de Python 3.8, vous pouvez utiliser la variable d'environnement
PYTHONPYCACHEPREFIX
pour définir un répertoire de cache pour Python.Depuis les documents Python:
Exemple
Si vous ajoutez la ligne suivante à votre
./profile
sous Linux:Python ne créera pas les
__pycache__
répertoires ennuyeux dans le répertoire de votre projet, mais les placera tous sous~/.cache/cpython/
la source
Vous pouvez rendre les répertoires dans lesquels vos modules existent en lecture seule pour l'utilisateur sous lequel l'interpréteur Python s'exécute.
Je ne pense pas qu'il existe une option plus élégante. PEP 304 semble avoir été une tentative d'introduire une option simple pour cela, mais il semble avoir été abandonné.
J'imagine qu'il y a probablement un autre problème que vous essayez de résoudre, pour lequel la désactivation de .py [co] semblerait être une solution de contournement, mais il serait probablement préférable d'attaquer à la place ce problème d'origine.
la source
Solution pour
ipython 6.2.1 using python 3.5.2
(Testé sur Ubuntu 16.04 et Windows 10):Ipython
ne respecte pas%env PYTHONDONTWRITEBYTECODE =1
s'il est défini dans l'ipython
interpréteur ou lors du démarrage dans~/.ipython/profile-default/startup/00-startup.ipy
. Utilisez plutôt les éléments suivants dans votre~.ipython/profile-default/startup/00-startup.py
la source
Autant que je sache, python compilera tous les modules que vous "importerez". Cependant, python ne compilera PAS un script python exécuté en utilisant: "python script.py" (il compilera cependant tous les modules que le script importe).
La vraie question est pourquoi vous ne voulez pas que python compile les modules? Vous pourriez probablement automatiser un moyen de les nettoyer s'ils gênent.
la source
.pyc
fichiers de bytecode périmés . Pour une raison quelconque, lorsque je change de classe / module, le.pyc
fichier n'est pas mis à jour. Ainsi, lorsque je l'importerai après avoir modifié le.py
fichier, il utilisera toujours le.pyc
fichier, ce qui entraînera des erreurs