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




setuptools distutils (4)

जब मैं दौड़ता हूं

  python setup.py sdist

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

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

मैं 'सेटअप' फंक्शन का उपयोग कर रहा हूं जो सेटपूल से आयात किया गया है। WindowsXP, Python2.7, Setuptools 0.6c11, 0.6.14 वितरित करें।

मेरा सेटअप कॉन्फ़िगरेशन ऐसा दिखता है:

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

यह निर्देशिका जानबूझकर स्रोत वितरण के लिए निर्माण प्रक्रिया के भाग के रूप में बनाई गई है। सेटपूल के लिए डेवलपर गाइड का थोड़ा सा गैंडर आपको संकेत देता है कि क्यों:

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

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

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

मैं *.pyc *.egg-info , dist , build , और *.pyc और अन्य फ़ाइलों को हटाने के लिए अपने कई Python प्रोजेक्ट्स पर अपने 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 (हां, मैं बहुत परिपक्व हूं), यह होता है:

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

टाडा!


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

कमांड setup.py egg_info रूप से अंडे के रूप में सोर्स रूट का उपयोग करेगा, जिसके परिणामस्वरूप PROJECT.egg PROJECT.egg-info डायरेक्टरी को sdist में पैक किया जाएगा।

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

PROJECT.egg PROJECT.egg-info मेरे बिना काम करने के लिए एक कमांडर बनाने के लिए निम्न कमांड:

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

या एक setup.cfg :

[egg_info]
egg_base = /tmp

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

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


पायथन पैकेजिंग और निर्माण प्रणाली टूटी हुई इम्हो है। तो कई हैक्स और वर्कअराउंड चीजें हैं जो एक बॉक्स के बाहर काम करेंगे।

हालाँकि, * .egg-info को हटाने के लिए मुझे मिली "सबसे साफ" हैक ने सामान्य clean --all स्विच का उपयोग किया है। साथ ही egg_info फाइल को सबफ़ोल्डर में रखें जिसे क्लीन कमांड द्वारा साफ किया जाएगा। । यहाँ एक उदाहरण है:

अपने setup.cfg कुछ इस तरह का उपयोग करें:

[egg_info]
egg_base = ./build/lib

कहाँ ./build/lib एक ऐसा फ़ोल्डर है जो clean --all हटा देगा। तब जब सेटपूल के साथ अपनी परियोजना का निर्माण करते हैं - स्वच्छ ध्वज के साथ स्वच्छ कमांड का उपयोग करते हैं, जैसे

python setup.py bdist_wheel clean --all

यदि आप एक स्रोत बंडल बनाना चाहते हैं और साथ ही साथ sdist से पहले bdist_wheel का निर्माण सुनिश्चित करें ताकि बिल्ड / लिबर फ़ोल्डर मौजूद हो, जैसे:

python setup.py bdist_wheel sdist clean --all







setup.py