复制 Pyinstaller 的许可证依赖项



这与上一个问题有关,但更具体地说是关于实现的。

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

Pyinstaller不会尝试处理此问题

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

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

venvLibsite-packages

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

有一个文件夹

venvLibsite-packagesopenpyxl-3.0.0-py3.7.egg-info

其中包含一个PKG-INFO文件。这将列出许可证(MIT/Expat(,但专门包含许可证文本。在这种情况下,是否可以接受包含PKG-INFO文件的副本或标准 MIT 许可证文本的一些副本?

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

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

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

matches = ["LICENSE.txt","METADATA","PKG-INFO"]
lics = []
print("Find 3rd party dependency license files")
for root, dir, files in os.walk("venvLibsite-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")

这将构建一个元组列表,其中包含许可证或元数据的来源,以及要在分发中将其复制到的目标。

为了进行实际复制,我在Analysis对象中使用了datas关键字,并简单地使用*lics展开列表。

这可以调整为包含更多matches或更智能并解析文件,或类似的东西。它也可能有点浪费,并且多次复制一些文件,但这似乎是一个小文本文件的最小开销。

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

最新更新