How to include license file in setup.py script?

拟墨画扇 提交于 2021-01-20 15:23:08

问题


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 bdist_egg) and a source distribution for UNIX-like platforms (built with setup.py sdist).

I plan to license the module under the BSD license. In my source tree, the file LICENSE.txt is in the top folder along with setup.py. How should I include it in the installation package?

I tried the following setup.py script:

from setuptools import setup, Extension
from glob import glob

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

It did not work, the license file is not included in the installation package. Maybe because the setup.py file does not define any packages, only a single extension module.

How do I fix this?


回答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.




回答2:


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




回答3:


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):
    return open(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")
)



回答4:


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).




回答5:


For example:

setup(
    ...
    license="ZPL",
    classifiers=[
        ...
        'License :: OSI Approved :: Zope Public License',
        ...
        ],
     ...)

additionally you can insert your licence text into 'long_description':

setup(
    ...
    long_description="Package description. \nLicense Text",
    ...)


来源:https://stackoverflow.com/questions/9977889/how-to-include-license-file-in-setup-py-script

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!