首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在setup.py脚本中包含许可文件?

如何在setup.py脚本中包含许可文件?
EN

Stack Overflow用户
提问于 2012-04-02 22:00:42
回答 6查看 18.7K关注 0票数 41

我已经用C++编写了一个Python扩展模块。我计划用setuptools发布这个模块。将有针对32位和64位Windows的二进制发行版(使用setup.py bdist_egg构建)和针对类UNIX平台的源代码发行版(使用setup.py sdist构建)。

我计划在BSD许可下许可该模块。在我的源码树中,文件LICENSE.txt和setup.py一起位于顶部文件夹中。如何将其包含在安装包中?

我尝试了以下setup.py脚本:

代码语言:javascript
复制
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']}
)

它不起作用,许可证文件未包含在安装包中。可能是因为setup.py文件没有定义任何包,只定义了一个扩展模块。

我该如何解决这个问题?

EN

回答 6

Stack Overflow用户

发布于 2018-02-09 01:55:28

编写一个setup.cfg文件,并在其中指定:

代码语言:javascript
复制
[metadata]
license_files = LICENSE.txt

要让它工作,似乎需要安装轮子。这就是:

代码语言:javascript
复制
pip install wheel

如果您已经安装了wheel,但它不工作,请尝试更新它:

代码语言:javascript
复制
pip install --upgrade wheel

然后,当通过pip install <path>安装软件包时,许可证文件将包含在内。

票数 20
EN

Stack Overflow用户

发布于 2021-03-03 01:08:52

setuptools 42.0.0开始,您可以使用license_files密钥指定要包含在发行版中的许可证文件列表。

请注意,由于有了implementation details,您实际上不需要将此密钥放入setup.cfg文件中(如documentationanother answer所建议的)。您可以简单地将其作为参数提供给setup()函数:

代码语言:javascript
复制
from setuptools import setup

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

还要注意的是,虽然这些文件将包含在二进制文件( will )和源代码发行版中,但如果用户没有安装setup.py-style软件包,它们将不会随wheel源代码发行版的软件包一起安装!

为确保许可证文件将随软件包一起安装,您需要对安装脚本进行一些额外的修改:

代码语言:javascript
复制
from setuptools import setup
from setuptools.command.egg_info import egg_info


class egg_info_ex(egg_info):
    """Includes license file into `.egg-info` folder."""

    def run(self):
        # don't duplicate license into `.egg-info` when building a distribution
        if not 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},
    ...
)

如果您的项目是一个pyproject.toml-style project,并且您认为它将由兼容PEP517的前端(例如pip>=19)安装,则将从您的源代码强制构建一个轮子,并且许可证文件将自动安装到.dist-info文件夹中。

票数 8
EN

Stack Overflow用户

发布于 2018-04-07 02:23:11

使用METADATA.in文件,许可可以自动包含在源包和控制盘中:

METADATA.in include README.md include COPYING

在这里查看一个示例:https://github.com/node40/smsh

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9977889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档