Skip to content Skip to sidebar Skip to footer

How To Include License File In Setup.py Script?

I have written a Python extension module in C++. I plan to distribute the module with setuptools. There will be binary distributions for 32- and 64-bit Windows (built with setup.py

Solution 1:

Write a setup.cfg file and in there specify:

[metadata]license_files = LICENSE.txt

For this to work it seems like wheel is required to be installed. That is:

pip install wheel

If you have wheel already installed and it doesn't work, try to update it:

pip install --upgrade wheel

Then when installing the package via pip install <path> the LICENSE file gets included.

Solution 2:

Since setuptools 42.0.0 you could use the license_files key to specify a list of license files to be included into a distribution.

Note that due to implementationdetails you actually don't need to put this key into setup.cfg file (as documentation and another answer suggest). You could simply supply it as an argument to setup() function:

from setuptools import setup

setup(
    ...
    license_files = ('LICENSE.txt',),
    ...
)

Also note that while these files will be included in both binary (wheel) and source distributions, they won't be installed with your package from setup.py-style source distribution if the user doesn't have a wheel package installed! To ensure the license files will be installed along with your package you need to make some additional modifications to your setup script:

from setuptools import setup
from setuptools.command.egg_info import egg_info


classegg_info_ex(egg_info):
    """Includes license file into `.egg-info` folder."""defrun(self):
        # don't duplicate license into `.egg-info` when building a distributionifnot self.distribution.have_run.get('install', True):
            # `install` command is in progress, copy license
            self.mkpath(self.egg_info)
            self.copy_file('LICENSE.txt', self.egg_info)

        egg_info.run(self)


setup(
    ...
    license_files = ('LICENSE.txt',),
    cmdclass = {'egg_info': egg_info_ex},
    ...
)

If your project is a pyproject.toml-style project and you think it will be installed by PEP 517-compatible frontend (e.g. pip>=19), a wheel will be forcibly built from your sources and the license files will be installed into .dist-info folder automatically.

Solution 3:

Using a METADATA.in file, the license can be included both the source package and wheels automatically:

METADATA.in include README.md include COPYING

Check out an example here: https://github.com/node40/smsh

Solution 4:

New setuptools (40.x) allows metadata, including license, to be stored in the setup.cfg's "metadata" section. If you use older setuptools you could provide license using the "license" named argument in your setup():

def read_text(file_name: str):
    returnopen(os.path.join(base_path, file_name)).read()


setup(
    name = 'Foo',
    version = '0.1.0',
    ext_modules = [Extension('Foo', glob('Source/*.cpp'))],
    # package_data = {'': ['LICENSE.txt']}
    license=read_text("LICENSE.txt")
)

Solution 5:

You have to move the LICENSE.txt file into the package directory for your project. It cannot reside the top level. Python directories get deployed, not the deployment artifact. If you create a python package, that package actually contains a number of subpackages. Each subpackage must contain ALL the files relevant to deployment.

Do not use data_files as it will actually distribute the files as a separate package. (I've heard package_files works, but I have yet to see a working example to do this).

Post a Comment for "How To Include License File In Setup.py Script?"