Why does "python setup.py sdist" create unwanted "PROJECT-egg.info" in project root directory? Why does "python setup.py sdist" create unwanted "PROJECT-egg.info" in project root directory? python python

Why does "python setup.py sdist" create unwanted "PROJECT-egg.info" in project root directory?


This directory is created intentionally as part of the build process for a source distribution. A little gander at the developer guide for setuptools gives you a hint as to why:

But, be sure to ignore any part of the distutils documentation that deals with MANIFEST or how it's generated from MANIFEST.in; setuptools shields you from these issues and doesn't work the same way in any case. Unlike the distutils, setuptools regenerates the source distribution manifest file every time you build a source distribution, and it builds it inside the project's .egg-info directory, out of the way of your main project directory. You therefore need not worry about whether it is up-to-date or not.

You may safely delete the directory after your build has completed.

Bonus edit:

I customize the clean command within my setup.py on many of my Python projects to delete *.egg-info, dist, build, and *.pyc and other files. Here's an example of how it's done in setup.py:

import osfrom setuptools import setup, Commandclass 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,    })

To illustrate, after running python setup.py build on a dummy project called "poop" (Yes, I'm very mature), this happens:

$ python setup.py buildrunning buildrunning build_pycreating buildcreating build/libcreating build/lib/poopcopying poop/__init__.py -> build/lib/poop

And now if we run python setup.py clean:

$ python setup.py cleanrunning cleanremoved `./build/lib/poop/__init__.py'removed directory: `./build/lib/poop'removed directory: `./build/lib'removed directory: `./build'

Tada!


The -egg.info folder isn't always a temporary artifact you can delete.

For example, if you use pip install -e YOURPACKAGE for an "editable" install (works via symlink like python setup.py develop so you don't have to re-install a package every time you edit it locally), the -egg.info folder is required at runtime when your package is imported in another source. If it doesn't exist, you will get a DistributionNotFound error.


Note that you can have the PROJECT.egg-info artifacts disappear completely from your sdist.

The command setup.py egg_info will use the source root as the egg base by default, resulting in the PROJECT.egg-info directory being packaged into the sdist.

You can configure the egg base by passing the option --egg-base.This will create the PROJECT.egg-info directory somewhere else, leaving it out of your source distribution completely. You might also use a setup.cfg to set that property.

The following command to create a sdist without a PROJECT.egg-info works for me:

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

Or in a setup.cfg:

[egg_info]egg_base = /tmp