2010-09-23 15 views
36

जब मैंप्रोजेक्ट रूट निर्देशिका में "python setup.py sdist" अवांछित "PROJECT-egg.info" क्यों बनाते हैं?

python setup.py sdist 

चलाने यह मेरी ./dist निर्देशिका में एक sdist पैदा करता है। इसमें मेरे "dist" फ़ोल्डर के अंदर ज़िप में "PROJECT-egg.info" फ़ाइल शामिल है, जिसका मैं उपयोग नहीं करता, लेकिन यह मुझे चोट नहीं पहुंचाता है, इसलिए मैं इसे अनदेखा करता हूं।

मेरा प्रश्न यह है कि भी मेरी परियोजना रूट निर्देशिका में "PROJECT-egg.info" फ़ोल्डर बनाएं? क्या मैं इसे बनाना बंद कर सकता हूं? यदि नहीं, तो क्या मैं इसे एसडीआईस्ट बनाने के तुरंत बाद हटा सकता हूं?

मैं setuptools से आयातित 'सेटअप' फ़ंक्शन का उपयोग कर रहा हूं। विंडोजएक्सपी, पायथन 2.7, Setuptools 0.6c11, 0.6.14 वितरित करें।

मेरे सेटअप config लगता है:

{'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

एफटीआर: संबंधित प्रश्न (लेकिन डुप्लिकेट नहीं: यह एसडीआईस्ट के दौरान बनाई गई अंडे-जानकारी फ़ाइल के बारे में है, दूसरा इंस्टॉलेशन के दौरान बनाई गई अंडे की जानकारी के बारे में है): http://stackoverflow.com/q/23460191/821378 –

उत्तर

47

इस निर्देशिका में जानबूझकर एक स्रोत वितरण के लिए निर्माण की प्रक्रिया के हिस्से के रूप में बनाया गया है। developer guide for setuptools पर एक छोटी सी हंस क्यों के रूप में आप एक संकेत देता है:

लेकिन, distutils प्रलेखन कि साथ सौदों MANIFEST या कैसे यह MANIFEST.in से उत्पन्न के किसी भी हिस्से की अनदेखी करने के लिए सुनिश्चित हो; setuptools इन मुद्दों से आपको ढालता है और किसी भी मामले में काम नहीं करता है। distutils के विपरीत, setuptools स्रोत वितरण मैनिफ़ेस्ट फ़ाइल हर बार जब आप एक स्रोत वितरण का निर्माण पुन: बनाता है, और यह अंदर यह बनाता है परियोजना की .egg-जानकारी निर्देशिका, बाहर अपने मुख्य परियोजना निर्देशिका के रास्ते से । इसलिए आपको की चिंता करने की आवश्यकता नहीं है कि यह अद्यतित है या नहीं।

आपके निर्माण के पूरा होने के बाद आप निर्देशिका को सुरक्षित रूप से हटा सकते हैं।

बोनस संपादित करें:

मैं *.egg-info, dist, build, और *.pyc और अन्य फाइलों को डिलीट करने के लिए अपने अजगर परियोजनाओं के कई पर मेरे setup.py भीतर clean आदेश को अनुकूलित। यहाँ कैसे यह 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, 
    } 
) 

समझाने के लिए, एक डमी "पूप" (हाँ, मैं बहुत परिपक्व हूँ) कहा जाता है परियोजना पर python setup.py build चलाने के बाद, ऐसा होता है:

$ 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 

और अब अगर हम चलाने 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' 

टाडा!

+0

कई अंतर्दृष्टि के लिए धन्यवाद। मैं कभी नहीं समझ सकता था कि मुझे डिस्ट्यूट या सेटअपटॉल्स या वितरित करने के लिए दस्तावेज़ों को खराब करना चाहिए या नहीं। मैं आपके उत्तर का चयन करने से पहले थोड़ी देर तक लटकने जा रहा हूं, बस अगर किसी तरह के क्वार की तरह कुछ है तो मैंने अभी तक यह नहीं देखा है कि सेटअप करने के लिए सेटअप नहीं किया जाए। –

+0

इसलिए मैंने 'मेक क्लीन' पर या 'एसडीआईडी' करने के बाद * .gg-info को हटाने के लिए मेरे मेकफ़ाइल में लाइनें जोड़ दीं। मुझे आश्वस्त करने के लिए धन्यवाद यह सब कुछ तोड़ने नहीं होगा। –

+1

आपका स्वागत है। यह वही है जो मैं अपने 'setup.py' के भीतर से करता हूं। मुझे खुशी है कि मैं मदद करने में सक्षम था! :) – jathanism

8

ध्यान दें कि आपके पास PROJECT.egg-info कलाकृतियां पूरी तरह से आपके एसडीआईस्ट से गायब हो सकती हैं।

कमांड setup.py egg_info स्रोत रूट को डिफ़ॉल्ट रूप से अंडा आधार के रूप में उपयोग करेगा, जिसके परिणामस्वरूप PROJECT.egg-info निर्देशिका एसडीआईस्ट में पैक की जा रही है।

आप --egg-base विकल्प को पार करके अंडे के आधार को कॉन्फ़िगर कर सकते हैं। यह PROJECT.egg-info निर्देशिका कहीं और बना देगा, इसे आपके स्रोत वितरण से पूरी तरह से छोड़ देगा। आप उस संपत्ति को सेट करने के लिए setup.cfg का भी उपयोग कर सकते हैं।

निम्न आदेश मेरे लिए एक PROJECT.egg-info काम करता है बिना एक sdist बनाने के लिए:

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

या में एक setup.cfg:

[egg_info] 
egg_base = /tmp 
+1

अफसोस की बात है, 'setuptools' जानबूझकर किसी बिंदु पर पूर्ण 'egg_base' पथनामों के लिए समर्थन तोड़ दिया। निम्नलिखित घातक त्रुटि अब उत्सर्जित की गई है: 'सेटअप() तर्क * हमेशा * setup.py निर्देशिका से संबंधित */अलग-अलग पथ होना चाहिए, * कभी नहीं * पूर्ण पथ। * * श्वास। * –

9

-egg.info फ़ोल्डर हमेशा एक अस्थायी विरूपण साक्ष्य आप नष्ट कर सकते हैं नहीं है ।

उदाहरण के लिए, यदि आप कोई "संपादन योग्य" के लिए pip install -e YOURPACKAGE का उपयोग स्थापित (सिमलिंक के माध्यम से काम करता है की तरह python setup.py develop ताकि आप एक पैकेज हर बार जब आप स्थानीय स्तर पर यह संपादित पुन: स्थापित करने की जरूरत नहीं है), -egg.info फ़ोल्डर कार्यावधि में आवश्यक है जब आपका पैकेज किसी अन्य स्रोत में आयात किया जाता है। यदि यह अस्तित्व में नहीं है, तो आपको DistributionNotFound त्रुटि मिल जाएगी।

+0

जानना अच्छा है, मैं इसका उपयोग करता हूं । धन्यवाद। –

संबंधित मुद्दे