How To Include License File In Setup.py Script?
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?"