关于 Python 的库开源问题

2021-03-31 22:16:43 +08:00
 linlin6
请教下各位老哥,有查询 Python 的第三方库用什么开源协议的网站吗,我现在安装都直接 pip install ***安装了,然后网上找的话这方面资料几乎没有,是要 fq 找吗。
主要是通过一些第三方库开发了几个软件,然后有人询问出售,目前不清楚这些库是用哪种开源协议的。
2177 次点击
所在节点    Python
11 条回复
wevsty
2021-03-31 22:28:43 +08:00
pip 安装的 lib 在 pypi 上可以直接找到授权信息:
比如:
https://pypi.org/project/numpy-stl/

如果 pypi 上没有写,就需要看项目本身的网站或者版本库了。
ClericPy
2021-03-31 22:33:45 +08:00
多数情况 Github 上都直接搜的到... 正规点的库在 pypi 官网也该填了的
no1xsyzy
2021-03-31 22:52:54 +08:00
$> grep '^License: ' $VIRTUAL_ENV/lib/python*/site-packages/*.dist-info/METADATA
no1xsyzy
2021-03-31 23:05:57 +08:00
$> awk 'BEGINFILE{PRINTED=0} /^License: /{print FILENAME, "-", $0; PRINTED=1} ENDFILE{if(PRINTED==0)print FILENAME, "- NO LICENSE!!!"}' $VIRTUAL_ENV/lib/python*/site-packages/*.dist-info/METADATA

欸,我写这干嘛(太诡了
sunhk25
2021-04-01 14:55:25 +08:00
有个库可以查出当前环境所有 pip 安装的软件的协议。名字忘了,可以找找。
linlin6
2021-04-01 22:04:08 +08:00
@wevsty
@ClericPy
@sunhk25 谢谢各位老哥
linlin6
2021-04-01 22:05:04 +08:00
@no1xsyzy 这是遍历出所有的 METADATA 文件吗😂😂😂
no1xsyzy
2021-04-02 09:24:32 +08:00
@linlin6 对的,但没有去校验 *.dist-info/LICENSE
理论上需要 LICENSE 文件配套才能算真的符合。
在线版可能在发生变动的情况下也跟你本地的不一致,如果你打包的话 LICENSE 文件才是实际对版权法生效的那个。

Metadata 里会有个问题,License 项没法区分 BSD-2-clause 和 BSD-3-clause,都是 BSD license,在 Classifier 项里才会有 BSD 和 BSD-like 的区别…… 具体也没细看。
sunhk25
2021-04-02 10:55:31 +08:00
```python
import pkg_resources

def get_pkg_license(pkg):
try:
lines = pkg.get_metadata_lines('METADATA')
except:
lines = pkg.get_metadata_lines('PKG-INFO')

license = 'UNKNOWN'
labels = ['License: ', 'Classifier: License :: OSI Approved :: ']
for label in labels:
for line in lines:
if line.startswith(label):
license = line[len(label):]
break
if license != 'UNKNOWN':
return license

return '(Licence not found)'

def get_pkg_home_page(pkg):
try:
lines = pkg.get_metadata_lines('METADATA')
except:
lines = pkg.get_metadata_lines('PKG-INFO')
label = 'Home-page: '
for line in lines:
if line.startswith(label):
url = line[len(label):]
break
if url == 'UNKNOWN':
url = 'https://pypi.python.org/pypi/'+pkg.key
return url

def create_packages_and_licenses_text():
text = ''
for pkg in sorted(pkg_resources.working_set, key=lambda x: str(x).lower()):
text += '\t'.join([pkg.key,pkg.version,get_pkg_license(pkg),get_pkg_home_page(pkg)]) + '\n'
return text

if __name__ == "__main__":
text = create_packages_and_licenses_text()
print(text)

filename = 'packages_and_licenses.txt'
with open(filename, 'w', encoding='Shift-JIS') as f:
f.write(text)
```
sunhk25
2021-04-02 10:58:46 +08:00
linlin6
2021-04-02 16:46:50 +08:00
@no1xsyzy 谢谢老哥

@sunhk25 谢谢老哥,能跑成功

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/767019

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX