2010-09-23 9 views
36

Quando eseguoPerché "python setup.py sdist" crea indesiderati "PROJECT-egg.info" nella directory principale del progetto?

python setup.py sdist 

si crea una sdist nella mia directory ./dist. Questo include un file "PROJECT-egg.info" nello zip all'interno della mia cartella "dist", che non uso, ma non mi fa male, quindi lo ignoro.

mia domanda è perché vuol anche creare una cartella "PROJECT-egg.info" nella mia cartella principale del progetto? Posso farlo smettere di creare questo? In caso contrario, posso cancellarlo immediatamente dopo aver creato il sdist?

Sto usando la funzione 'setup' importata da setuptools. WindowsXP, Python2.7, Setuptools 0.6c11, Distribuisci 0.6.14.

La mia configurazione config assomiglia:

{'author': 'Jonathan Hartley', 
'author_email': '[email protected]', 
'classifiers': ['Development Status :: 1 - Planning', 
       'Intended Audience :: Developers', 
       'License :: OSI Approved :: BSD License', 
       'Operating System :: Microsoft :: Windows', 
       'Programming Language :: Python :: 2.7'], 
'console': [{'script': 'demo.py'}], 
'data_files': [('Microsoft.VC90.CRT', 
       ['..\\lib\\Microsoft.VC90.CRT\\Microsoft.VC90.CRT.manifest', 
        '..\\lib\\Microsoft.VC90.CRT\\msvcr90.dll'])], 
'description': 'Utilities for games and OpenGL graphics, built around Pyglet.\n', 
'keywords': '', 
'license': 'BSD', 
'long_description': "blah blah blah", 
'name': 'pygpen', 
'options': {'py2exe': {'ascii': True, 
         'bundle_files': 1, 
         'dist_dir': 'dist/pygpen-0.1-windows', 
         'dll_excludes': [], 
         'excludes': ['_imaging_gif', 
            '_scproxy', 
            'clr', 
            'dummy.Process', 
            'email', 
            'email.base64mime', 
            'email.utils', 
            'email.Utils', 
            'ICCProfile', 
            'Image', 
            'IronPythonConsole', 
            'modes.editingmodes', 
            'startup', 
            'System', 
            'System.Windows.Forms.Clipboard', 
            '_hashlib', 
            '_imaging', 
            '_multiprocessing', 
            '_ssl', 
            '_socket', 
            'bz2', 
            'pyexpat', 
            'pyreadline', 
            'select', 
            'win32api', 
            'win32pipe', 
            'calendar', 
            'cookielib', 
            'difflib', 
            'doctest', 
            'locale', 
            'optparse', 
            'pdb', 
            'pickle', 
            'pyglet.window.xlib', 
            'pyglet.window.carbon', 
            'pyglet.window.carbon.constants', 
            'pyglet.window.carbon.types', 
            'subprocess', 
            'tarfile', 
            'threading', 
            'unittest', 
            'urllib', 
            'urllib2', 
            'win32con', 
            'zipfile'], 
         'optimize': 2}}, 
'packages': ['pygpen'], 
'scripts': ['demo.py'], 
'url': 'http://code.google.com/p/edpath/', 
'version': '0.1', 
'zipfile': None} 
+0

FTR: domanda correlata (ma non duplicata: si tratta di un file di informazioni sull'uovo creato durante sdist, l'altro di informazioni sull'uovo create durante l'installazione): http://stackoverflow.com/q/23460191/821378 –

risposta

47

Questa directory viene creata intenzionalmente come parte del processo di generazione per una distribuzione sorgente. Un po 'un'occhiata alla developer guide for setuptools si dà un suggerimento sul perché:

Ma, assicurarsi di ignorare qualsiasi parte della documentazione distutils che si occupa con manifesto o come è generata da MANIFEST.in; setuptools scudi voi da questi problemi e non funziona allo stesso modo in ogni caso. A differenza dei Distutils, setuptools rigenera il file manifesto distribuzione sorgente ogni volta che si genera una fonte di distribuzione, e si costruisce dentro directory .egg-info del progetto, fuori del modo della directory principale del progetto . Pertanto non è necessario che lo sia aggiornato o meno .

È possibile eliminare la directory in modo sicuro al completamento della compilazione.

Bonus edit:

personalizzo il comando clean nel mio setup.py su molti dei miei progetti Python per eliminare *.egg-info, dist, build, e *.pyc e altri file. Ecco un esempio di come si fa in setup.py:

import os 
from setuptools import setup, Command 

class CleanCommand(Command): 
    """Custom clean command to tidy up the project root.""" 
    user_options = [] 
    def initialize_options(self): 
     pass 
    def finalize_options(self): 
     pass 
    def run(self): 
     os.system('rm -vrf ./build ./dist ./*.pyc ./*.tgz ./*.egg-info') 

# Further down when you call setup() 
setup(
    # ... Other setup options 
    cmdclass={ 
     'clean': CleanCommand, 
    } 
) 

Per illustrare, dopo l'esecuzione python setup.py build su un progetto fittizio denominato "cacca" (Sì, sono molto maturo), questo accade:

$ python setup.py build 
running build 
running build_py 
creating build 
creating build/lib 
creating build/lib/poop 
copying poop/__init__.py -> build/lib/poop 

E ora se corriamo python setup.py clean:

$ python setup.py clean 
running clean 
removed `./build/lib/poop/__init__.py' 
removed directory: `./build/lib/poop' 
removed directory: `./build/lib' 
removed directory: `./build' 

Tada!

+0

Molti grazie per l'intuizione Non potrei mai capire se dovrei spazzare i documenti per distutils o setuptools o distribuire. Ho intenzione di fermarmi un po 'prima di selezionare la tua risposta, nel caso ci sia qualcosa come un kwarg che non ho ancora visto per impostare setuptools di non farlo. –

+0

Così ho aggiunto delle righe al mio Makefile per cancellare * .egg-info su 'make clean', o dopo aver fatto 'make sdist'. Grazie per avermi rassicurato, questo non spezzerà necessariamente tutto. –

+1

Prego. Questo è esattamente ciò che faccio anche all'interno del mio 'setup.py'. Sono contento di essere stato in grado di aiutarti! :) – jathanism

8

Nota che è possibile far scomparire completamente gli artefatti PROJECT.egg-info dal proprio sdist.

Il comando setup.py egg_info utilizzerà la radice di origine come base uovo per impostazione predefinita, facendo in modo che la directory PROJECT.egg-info sia impacchettata nel sdist.

È possibile configurare la base dell'uovo passando l'opzione --egg-base. Ciò creerà la directory PROJECT.egg-info da qualche altra parte, lasciandola completamente fuori dalla vostra distribuzione di origine. Potresti anche usare un setup.cfg per impostare quella proprietà.

il seguente comando per creare uno sdist senza un PROJECT.egg-info opere per me:

python setup.py egg_info --egg-base /tmp sdist 

O in un setup.cfg:

[egg_info] 
egg_base = /tmp 
+1

Purtroppo, 'setuptools' ha interrotto intenzionalmente il supporto per i pathname assoluti di' egg_base' ad un certo punto. Viene ora emesso il seguente errore fatale: Gli argomenti 'setup() devono * sempre * essere/separati percorsi relativi alla directory setup.py, * mai * percorsi assoluti. * * Sigh. * –

9

La cartella -egg.info non è sempre un manufatto provvisorio è possibile eliminare .

Per esempio, se si utilizza pip install -e YOURPACKAGE per un "modificabile" installazione (opere tramite collegamento simbolico come python setup.py develop quindi non c'è bisogno di re-installare un pacchetto ogni volta che si modifica a livello locale), la cartella -egg.info è necessaria in fase di esecuzione quando il tuo pacchetto è importato in un'altra fonte. Se non esiste, si otterrà un errore DistributionNotFound.

+0

buono a sapersi, lo uso . Grazie. –

Problemi correlati