复制Pyinstaller的许可证依赖性

时间:2020-02-04 12:02:31

标签: python-3.x pyinstaller

这与a previous question有关,但更具体地说是关于实施。

要回顾上一个问题,我有一个带有第三方依赖的Pyinstaller应用程序。正如@AKX回答的那样,来自这些依赖项的许可证文本应包含在Pyinstaller发行版中。

Pyinstaller不会尝试处理此问题

因此,我正在寻找一种自动执行此过程的方法。

我的项目使用虚拟环境,并且依赖项位于:

\venv\Lib\site-packages

一种选择是递归搜索该文件夹,并找到与特定模式匹配的任何文件(例如LICENSE.txt)。 但是,某些软件包不附带许可证文件,而只是在元数据中命名许可证。例如,我正在使用openpyxl

有一个文件夹

\venv\Lib\site-packages\openpyxl-3.0.0-py3.7.egg-info

包含一个PKG-INFO文件。它列出了许可证(MIT / Expat),但确实包含许可证文本。在这种情况下,包含PKG-INFO文件的副本还是标准MIT许可证文本的某些副本是否可以接受?

有人遇到这个问题并以优雅的方式实施了解决方案吗? @AKX(in the previous question链接到一个工具,该工具以文本/ json等形式输出许可证信息。但是实际上并没有尝试移动任何文件。

1 个答案:

答案 0 :(得分:1)

如果有人有类似的问题,这是我实施的解决方案,对我来说似乎很不错:

在我的.spec文件的顶部,添加了这个

matches = ["LICENSE.txt","METADATA","PKG-INFO"]
lics = []
print("Find 3rd party dependency license files")
for root, dir, files in os.walk("venv\Lib\site-packages"):
    for file in files:
            if file in matches:
               src = f"{root}/{file}"
               dest = f"licenses/{os.path.basename(root)}"
               lics.append((src,dest))
               print(f"\tLicense file: {root}/{file}")
print(f"{len(lics)} dependency licenses found. Copying to /license folder in distribution")

生成一个元组列表,其中包含许可证或元数据的源,以及将其复制到分发中的目的地。

要进行实际的复制,我使用了datas对象中的Analysis关键字,并使用*lics扩展了列表。

这可能适用于包含更多matches,或者更聪明地解析文件或类似内容。可能还有些浪费,并且多次复制某些文件,但这对于最小的文本文件来说似乎是最小的开销。

如果有人看到了这个问题并提出了建议或意见,那么我很乐意进一步了解这个问题!