2010-09-23 9 views
36

Als ichWarum erstellt "python setup.py sdist" unerwünschte "PROJECT-egg.info" im Projektstammverzeichnis?

python setup.py sdist 

laufen schafft sie eine Sdist in meinem ./dist Verzeichnis. Dies beinhaltet eine "PROJECT-Egg.info" -Datei in der Zip-Datei in meinem "dist" -Ordner, die ich nicht benutze, aber es tut mir nicht weh, also ignoriere ich es einfach.

Meine Frage ist, warum es auch einen "PROJECT-Egg.info" Ordner in meinem Projekt-Stammverzeichnis erstellen? Kann ich damit aufhören, das zu schaffen? Wenn nicht, kann ich es sofort löschen, nachdem ich den sdist erstellt habe?

Ich verwende die Setup-Funktion von SetupTools importiert. WindowsXP, Python2.7, Setuptools 0.6c11, Verteilen 0.6.14.

Mein Setup Config wie folgt aussieht:

{'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: Verwandte Frage (aber nicht doppelt: dieses ist über Ei-Info-Datei während sdist erstellt, die andere über Ei-Info während der Installation erstellt): http://StackOverflow.com/q/23460191/821378 –

Antwort

47

Dieses Verzeichnis absichtlich als Teil des Build-Prozesses für eine Source-Distribution erstellt wird. Ein kleiner Blick an den developer guide for setuptools gibt Ihnen einen Hinweis, warum:

aber sicher sein, einen Teil der distutils Dokumentation zu ignorieren, die mit manifester beschäftigt oder wie ist es von MANIFEST.in erzeugt; setuptools Schilde Sie von diesen Problemen und funktioniert auf die gleiche Weise in keinem Fall. Im Gegensatz zu dem distutils, regenerieren die Setuptools Quellenverteilung Manifest-Datei jedes Mal, wenn eine Quelle Verteilung bauen, und es baut es in das .egg-info Verzeichnis des Projektes, aus der Art und Weise Ihres Hauptprojekt Verzeichnisses. Sie brauchen also nicht sich sorgen, ob es aktuell ist oder nicht.

Sie können sicher das Verzeichnis löschen, nachdem Ihr Build abgeschlossen hat.

Bonus edit:

I fertigen den clean Befehl in meinem setup.py auf vielen meiner Python Projekte *.egg-info, löschen dist, build und *.pyc und andere Dateien. Hier ist ein Beispiel dafür, wie es in setup.py getan:

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, 
    } 
) 

Zur Veranschaulichung nach python setup.py build auf einem Dummy-Projekt läuft als "Poop" (Ja, ich bin sehr reif), dies geschieht:

$ 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 

Und jetzt, wenn wir python setup.py clean laufen:

$ 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

Viele Danke für die Einsicht. Ich könnte nie herausfinden, ob ich die Dokumente nach Distutils oder Setuptools durchsuchen oder verteilen sollte. Ich werde eine Weile warten, bevor ich deine Antwort auswähle, nur für den Fall, dass es so etwas wie einen Kwarg gibt, den ich noch nicht entdeckt habe, um setuptools zu sagen, dass er das nicht tun soll. –

+0

Also habe ich Zeilen zu meinem Makefile hinzugefügt, um * .egg-info auf 'make clean' zu löschen, oder nach einem 'make sdist'. Danke, dass du mich beruhigt hast, das wird nicht unbedingt alles kaputt machen. –

+1

Gern geschehen. Genau das tue ich auch von meinem 'setup.py' aus. Ich bin froh, dass ich helfen konnte! :) – jathanism

8

Beachten Sie, dass Sie die PROJECT.egg-info Artefakte vollständig von Ihrem SDist verschwinden lassen können.

Der Befehl setup.py egg_info verwendet standardmäßig den Quellstamm als Eierbasis, was dazu führt, dass das Verzeichnis PROJECT.egg-info in den sdist gepackt wird.

Sie können die Eierbasis konfigurieren, indem Sie die Option --egg-base übergeben. Dadurch wird das Verzeichnis PROJECT.egg-info an einem anderen Ort erstellt, sodass es vollständig aus der Quelldistribution entfernt wird. Sie können auch eine setup.cfg verwenden, um diese Eigenschaft festzulegen.

Der folgende Befehl einen Sdist ohne ein PROJECT.egg-info Werke für mich zu erstellen:

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

Oder in einem setup.cfg:

[egg_info] 
egg_base = /tmp 
+1

Leider hat 'setuptools' absichtlich die Unterstützung für absolute 'ei_base'-Pfadnamen irgendwann zerstört. Der folgende fatale Fehler wird nun ausgegeben: 'setup() Argumente müssen * immer */getrennte Pfade relativ zum setup.py Verzeichnis sein, * nie * absolute Pfade.' * Seufz. * –

9

Der -egg.info Ordner nicht immer ein temporäres Artefakt Sie löschen können .

Zum Beispiel, wenn Sie pip install -e YOURPACKAGE für einen „editierbar“ verwenden installieren (Arbeiten über Symlink wie python setup.py develop so müssen Sie nicht neu installieren ein Paket jedes Mal, wenn es lokal bearbeiten), die -egg.info Ordner werden zur Laufzeit erforderlich wenn Ihr Paket in eine andere Quelle importiert wird. Wenn es nicht existiert, erhalten Sie einen DistributionNotFound Fehler.

+0

Gut zu wissen, ich benutze das . Vielen Dank. –

Verwandte Themen