这与上一个问题有关,但更具体地说是关于实现的。
回顾上一个问题,我有一个具有第三方依赖项的 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
或更智能并解析文件,或类似的东西。它也可能有点浪费,并且多次复制一些文件,但这似乎是一个小文本文件的最小开销。
如果有人看到这个并有建议或意见,那么我很乐意进一步了解这个主题!