2009-03-04 10 views
14

Possible en double:
Way to have compiled python files in a separate folder?Les fichiers de bytecode compilés (.pyc) peuvent-ils être générés dans un répertoire différent?

Lorsque python compile des modules à bytecode, il produit .pyc fichiers de vos fichiers .py.

Ma question est, est-il possible d'avoir ces fichiers .pyc écrits dans un répertoire différent de celui où réside le module?

Par exemple, j'ai un grand répertoire de modules. Plutôt que de l'avoir jonché de fichiers .pyc, je voudrais garder mon code source dans le répertoire et avoir un sous-répertoire comme "bytecode" où tous les fichiers .pyc sont stockés.

Est-ce possible?

+0

Sinon avec python lui-même, alors vous pourriez écrire un script shell pour le faire avec find, xargs et move. –

Répondre

14

La réponse donnée dans "Way to have compiled python files in a seperate folder?"

Réponse courte: Non - sauf si vous exécutez Python 3.2 ou version ultérieure - voir here.

Pour clarifier: Avant 3.2, vous peut compiler bytecode et le mettre ailleurs selon la suggestion de Brian R. Bondy, mais à moins que vous exécutez réellement à partir de là (et non pas du dossier que vous voulez garder vierge) Python sort toujours le bytecode où les fichiers .py sont.

+0

Meilleure réponse: Cela fonctionne seulement dans 3.2 ou ci-dessus. Pas avant. Cette question est un doublon; suivez le lien ci-dessus. –

0

Je me souviens d'avoir lu quelque part que ce n'était pas possible et que les gens de Python avaient des raisons de ne pas le rendre possible, même si je ne me souviens plus où.

EDIT: désolé, j'ai mal lu la question - ce que je voulais dire est que ce n'est pas possible (je pense) pour configurer l'exécutable Python pour mettre ses fichiers bytecode dans un autre répertoire par défaut. Vous pouvez toujours écrire un petit script de compilation Python (ou en trouver un, je suis sûr qu'ils sont là) qui mettrait les fichiers bytecode dans un emplacement de votre choix.

7

Vérifiez la py_compile module, et notamment:

py_compile.compile(file[, cfile[, dfile[, doraise]]]) 

CFILE est le paramètre qui vous intéresse

À partir du lien ci-dessus.

... Le byte code est écrit à cfile, qui par défaut de fichier + 'c' ...

0

Vous pouvez écrire un script pour les compiler, puis les déplacer. Quelque chose comme:

for i in `ls *.pyc` 
do 
mv $i $DEST_DIR 
done 

(qui peut être réduite à:

for i in *.pyc 
do 
    mv $i $DEST_DIR 
done 

ou, de façon surprenante, à

mv *.pyc $DEST_DIR 

)

+0

J'ai ajouté deux autres versions de votre code, bien que je crois que sa fonctionnalité soit équivalente à 'rm * .pyc': les fichiers compilés peuvent être déplacés; et alors? – tzot

2

Dans le cas où le « littering » est en effet votre problème, vous pouvez toujours emballer .py, .pyc et/ou .pyo fichiers dans un fichier .zip et l'ajouter à votre sys.path.

3

Je cherchais une réponse à cela moi-même, et je ne pouvais pas trouver trop. Cependant, vous pouvez simplement préfixe le nom du dossier au nom du nouveau fichier compilé (besoin de faire le dossier sûr existe d'abord)

est ici un code qui fonctionne pour moi:

import py_compile 
import os 
import glob 
import shutil 

path = '' 
for infile in glob.glob(os.path.join(path, '*.py')): 
    print "current file is: " + infile 
    strDestination = 'compiled/' + infile + 'c' 
    py_compile.compile(infile,strDestination)