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

Joh*_*åde 24 python setuptools

我用C++编写了一个Python扩展模块.我打算用setuptools分发模块.将有用于32位和64位Windows(内置setup.py bdist_egg)的二进制发行版和用于类UNIX平台(内置setup.py sdist)的源代码发行版.

我打算根据BSD许可证授权该模块.在我的源代码树中,文件LICENSE.txt与setup.py一起位于顶层文件夹中.我应该如何将其包含在安装包中?

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

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']}
)
Run Code Online (Sandbox Code Playgroud)

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

我该如何解决?

Evg*_*423 19

setuptools\xc2\xa042.0.0开始,您可以使用该license_files密钥指定要包含到发行版中的许可证文件列表。从 version\xc2\xa056.0.0 开始,它支持模式匹配,默认为(\'LICEN[CS]E*\', \'COPYING*\', \'NOTICE*\', \'AUTHORS*\').

\n

请注意,由于实现 细节的原因,实际上不需要将此密钥放入setup.cfg文件中(正如另一个答案所暗示的那样)。setup()您可以将其作为函数的参数提供:
\n (在撰写本文时文档对此尚不清楚)

\n
from setuptools import setup\n\nsetup(\n    ...\n    license_files = (\'LICENSE.txt\',),\n    ...\n)\n
Run Code Online (Sandbox Code Playgroud)\n

另请注意,虽然这些文件将包含在二进制(轮)和源代码发行版中,但如果用户没有安装软件包,它们将不会与您的软件包一起安装在setup.py-stylewheel源代码发行版中!
\n为了确保许可证文件与您的软件包一起安装,您需要对安装脚本进行一些额外的修改:

\n
from setuptools import setup\nfrom setuptools.command.egg_info import egg_info\n\n\nclass egg_info_ex(egg_info):\n    """Includes license file into `.egg-info` folder."""\n\n    def run(self):\n        # don\'t duplicate license into `.egg-info` when building a distribution\n        if not self.distribution.have_run.get(\'install\', True):\n            # `install` command is in progress, copy license\n            self.mkpath(self.egg_info)\n            self.copy_file(\'LICENSE.txt\', self.egg_info)\n\n        egg_info.run(self)\n\n\nsetup(\n    ...\n    license_files = (\'LICENSE.txt\',),\n    cmdclass = {\'egg_info\': egg_info_ex},\n    ...\n)\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

从 version\xc2\xa061.0.0 开始,您可以在文件中指定项目元数据和其他配置选项pyproject.toml

\n


orl*_*rlp 17

用途data_files:

setup(
    name = "Foo",
    version = "0.1.0",
    ext_modules = [Extension("Foo", glob("Source/*.cpp"))],
    data_files = [("", ["LICENSE.txt"])]
)
Run Code Online (Sandbox Code Playgroud)

两个评论:

  1. 无需直接向您的产品发送许可证,您可以使用distutils中的许可证元数据来指定此项.

  2. 不要在代码中使用混合的单引号和双引号:)


Al *_*rad 8

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

[metadata]
license_files = LICENSE.txt
Run Code Online (Sandbox Code Playgroud)

为此,似乎需要安装滚轮。那是:

[metadata]
license_files = LICENSE.txt
Run Code Online (Sandbox Code Playgroud)

如果您wheel已经安装但无法使用,请尝试更新它:

pip install wheel
Run Code Online (Sandbox Code Playgroud)

然后,当通过pip install <path>LICENSE文件安装软件包时,将包括在内。

  • 适用于我,适用于轮子和 sdists。 (3认同)
  • **提示:**新的“license_files”元数据仅适用于 _wheels_,不适用于 _sdists_,而现已弃用的“license_file”对两者都适用。使用`MANIFEST.in`单独控制_sdist_内容。 (2认同)
  • 对于“setuptools”,“license_file”键[非常*未*弃用](https://github.com/pypa/setuptools/blob/70b3ec0bf0f61d6b7de1beff4bad4b845d836100/setuptools/command/sdist.py#L223)。“setuptools”继续透明地支持“license_file”*和*“license_files”密钥,没有任何抱怨。只有“wheel”包单方面弃用了“license_file”密钥——当然,用功能更少的密钥替换该密钥。考虑同时定义两者(*是的,这是马铃薯*)或仅定义“license_file”密钥(即忽略“wheel”)。`&lt;/picard_facepalm&gt;` (2认同)

Mak*_*cha -5

例如:

setup(
    ...
    license="ZPL",
    classifiers=[
        ...
        'License :: OSI Approved :: Zope Public License',
        ...
        ],
     ...)
Run Code Online (Sandbox Code Playgroud)

此外,您可以将许可证文本插入“long_description”:

setup(
    ...
    long_description="Package description. \nLicense Text",
    ...)
Run Code Online (Sandbox Code Playgroud)

  • 这如何在任何地方包含许可证_文件_? (13认同)