这与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等形式输出许可证信息。但是实际上并没有尝试移动任何文件。
答案 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
,或者更聪明地解析文件或类似内容。可能还有些浪费,并且多次复制某些文件,但这对于最小的文本文件来说似乎是最小的开销。
如果有人看到了这个问题并提出了建议或意见,那么我很乐意进一步了解这个问题!