Start simple
Simplest one-file package:
MyProject/
setup.py
my_package.py
Simplest setup.py:
from setuptools import setup
setup(name='MyProject',
version='0.1',
author='Your Name',
author_email='[email protected]',
license='MIT',
description='Example package that says hello',
py_modules=['my_package'])
Including extra files in the package
Next you should probably add a README:
MyProject/
MANIFEST.in
README.rst
setup.py
my_package.py
Note the new file -- MANIFEST.in. It specifies which non-Python files ought to be included in your source distribution:
include *.rst
People will tell you "oh, skip the manifest, just add the files to source control, setuptools will find them". Ignore that advice, it's too error-prone.
Making the PyPI page useful
It's useful to make the README.rst available for people to view online, on the Python Package Index. So change your setup.py to do
from setuptools import setup
with open('README.rst') as f:
readme = f.read()
setup(name='MyProject',
...
description='Example package that says hello',
long_description=readme,
...)
Use ReStructuredText markup for prettier pages. Use
python setup.py --long-description | rst2html
to catch ReStructuredText errors early.
More than one Python module in a package
One file will not be enough soon, so change it to a package (confusing terminology warning: Python package as in a directory with a __init__ py
, not as in a distributable self-contained archive):
MyProject/
MANIFEST.in
README.rst
setup.py
my_package/
__init__.py
some_module.py
and change setup.py to
from setuptools import setup, find_packages
with open('README.rst') as f:
readme = f.read()
setup(name='MyProject',
version='0.2',
author='Your Name',
author_email='your@email',
license='MIT',
description='Example package that says hello',
long_description=readme,
packages=find_packages())
Releasing to the public
Get a PyPI account -- you only need to do this once.
To make a release, make sure the version number in setup.py is correct, then run
python setup.py sdist register upload
That's it.
Telling people to install it
Tell them to
pip install MyProject
(same name you specified in setup.py as the name
argument to setup())