标签 PyPI 下的文章

中国淡出超算 TOP500 榜单

最新的一期超级计算机 TOP500 榜单已经出炉,前十名和上一期一样,没有变化。美国橡树岭国家实验室的 Frontier 仍然是唯一上榜的 E 级的超大规模系统。在榜单中的排名前列的中国超算还是太湖之光和天河 2A,分别位列第 7 和第 10。在此次榜单中,中国有 134 台超算,2023 年只增加了一台吉利公司的超算。而之前的一些论文中的数据透露,中国还有更强大的超算,但是没有显示在榜单中。

消息来源:The Register
老王点评:显然,中国已经不再需要参加这种榜单的排名了。原因大家都懂。

微软展示云电脑 Windows 365 Boot

微软在 Build 2023 上展示了一个技术预览,让物理 PC 可以启动到在 Azure 中运行的虚拟 PC,而不是从其本地驱动器运行 Windows。这项名为 “Windows 365 Boot” 的技术被认为是 “共享设备的一个伟大的解决方案,在那里用独特的用户身份登录可以把你带到你自己的个人和安全的云电脑。”不过微软没有说这项技术何时能普遍使用。

消息来源:The Register
老王点评:云电脑并不是什么稀奇的事情。但是我依然还是喜欢用本地电脑 —— 哦,不,我不使用 Windows。

PyPI 正在减少存储的 IP 地址数据

之前,我们 报道 过,Python 官方软件包库 PyPI 应美国司法部要求向其提供了几个用户的数据,包括 IP 地址等信息。这引来了一些用户对隐私的关切。PyPI 表示,它正在努力减少它所存储的用户数据,其目的不是为了无法回应合法的信息要求,而是为了只存储必要的最低数量的数据,以免使用户受到不必要的隐私侵犯。但这一努力早在 2020 年就在进行,自从此次提供了数据后,又被重新启动。

消息来源:The Register
老王点评:监管与隐私之间的平衡,确实难以拿捏。不知道国外有没有要求必须保存什么数据、保存多久的要求。

澳证交所宣告用区块链改造其核心交易系统失败

澳大利亚证券交易所(ASX)在 2017 年曾宣布用基于区块链的替代品取代其核心交易系统 CHESS,但一直到 2022 年都 未曾完工,并在去年 11 月 “暂停” 了该工作,因为外部审查发现该软件在开发了七年后必须进行大量的返工。ASX 表示它正在考虑再次尝试重建这个有 30 年历史的软件的方案,但不会涉及区块链或相关的分布式账本技术。

消息来源:路透社
老王点评:这原本是世界上最引人注目的概念用例之一。在区块链技术被热捧时,似乎什么都应该用区块链来重新写一下。当热潮退去,另外一个热潮来临时,一切都打回了原形。但是我依然认为区块链有其价值,在褪去那些炫目的光环后,它本质的东西才能剩下。

英特尔研究开发仅支持 64 位的 x86S 架构

自 Windows 7 以来,大部分 PC 用户运行的 Windows 操作系统都是 64 位,搭载的内存也超过了 4GB,64 位应用和游戏都逐渐成为了主流。对英特尔而言,简化 x86 指令集架构,只支持 64 位显然有诸多好处。英特尔发表了一份白皮书,探索了仅 64 位的 x86S 架构。在新的架构中,用 64 位的简化分段模型分段支持 32 位应用,移除了 16 位寻址支持。64 位的 x86S 芯片仍然支持 32 位应用,但不再支持 32 位操作系统。

消息来源:英特尔
老王点评:是时候考虑全面转向 64 位了,就像当时从 8 位、16 位升级到 32 位一样。抛掉历史包袱,显然更好。虽然这一天来的不算早,但是依然有点意外。

大量恶意项目导致 PyPi 暂停新注册两天

上周六,官方的 Python 软件包第三方注册机构 PyPI “暂时停止了新用户的注册和新项目的上传”。PyPI 称,在过去的一周里,在其上创建的恶意用户和恶意项目的数量已经超过了应对能力,“特别是在多个 PyPI 管理员休假的情况下”。现在,PyPI 表示“暂停服务已被解除”,但没有提供更多细节。

消息来源:Bleeping Computer
老王点评:在第三方软件库越来越成为基础设施的重要一环时,其承担了太多原本没有预料的压力。也许是该考虑在新的形势下,如何改进已经用了数十年的第三方中心化的软件库的机制、架构和流程了。

亚马逊网站今晨突发宕机 2 小时

从商品量、收入规模等数据来看,亚马逊可以说是世界第一大购物平台。网络服务检测网站 Downdetector 的追踪数据证实,美东时间 6 月 13 日下午 1 点到 3 点,亚马逊主站出现了宕机,长达 2 小时。讽刺的是,根据统计显示,亚马逊多年都是全球第一大云服务供应商,已经建立了自研芯片、服务器、计算、存储、网络等软硬一体的新型计算体系架构。

消息来源:路透社
老王点评:连亚马逊这样的毫无疑问的云计算第一大厂,都保不了自己的电商网站,那么我们追求的云计算它到底可靠吗?

K-9 邮件加入 Thunderbird 邮件旗下

Thunderbird 是最好的开源邮件桌面客户端,但一直没有对应的移动客户端。如果要开发一个功能完备的移动客户端可能花费很长时间。因此,Mozilla 选择将 K-9 邮件移动客户端及其维护者收入旗下。以《神秘博士》中的机器狗命名的 K-9 也是一个开源项目,它可能是安卓上功能最丰富的电子邮件应用。目前该客户端计划中的功能包括:账号设置使用 Thunderbird 账号自动配置、支持信息过滤器,在桌面和移动版本的 Thunderbird 之间进行同步等等。不过,Thunderbird 的日历、任务、馈送等非电子邮件功能不会出现在移动应用中。

消息来源:Thunderbird
老王点评:这看起来是一件好事,强强联手。不过,希望 K-9 和 Thunderbird 的融合对两者都有利,而不是互相冲突。

PyPI 多个软件包因拼写错误包含后门

PyPI 软件包 keep 的绝大部分版本都包含合法的 Python 模块 requests,该模块用于 HTTP 请求,但 keep v.1.2 包含的模块 request(没有 s)是一个恶意程序,能从 Chrome 和 Firefox 等浏览器中窃取 cookie 和个人信息,并尝试窃取浏览器保存的登录凭证。除此以外,还有一些其它的 PyPI 软件包也存在这种安全缺陷。

消息来源:BleepingComputer
老王点评:难道这些软件包的开发人员就不做测试吗?你想想,你精心搭建的软件就是建立在一些别人随手写出来的模块之上。

Steam 调查显示其 Linux 市场份额达到 1%

最大的 PC 数字游戏平台 Steam 公布的 7 月调查显示,Steam 的 Linux 市场份额达到了 1%,比之前一个月增加了 0.14%。而 Windows 则占比 96.49%,0SX 占比 2.51%。不过,在 Steam 在 Linux 上首次亮相时,Linux 的市场份额约为 2%,然后逐渐下降,在过去三年里,基本上都在 0.8~0.9% 的水平上浮动。下降的主要原因可能是 Steam 的整体客户群现在要大得多。

现在有了 Steam Proton,据玩家测试,在 1.9 万款游戏中有超过 1.5 万款游戏能在 Linux 上正常运行。

之所以 Linux 份额不高,主要原因还是人们不习惯用 Linux 吧。

Debian 告知用户其系统在没有商业固件的情况下可能无法工作

一些老的硬件设备的固件被永久性放入到 EEPROM/Flash 中,而现代的硬件往往需要在系统引导时从宿主系统加载固件。但是这种只有二进制的文件不被视为自由软件,因此不能被放入到 Debian 的主发行版或安装程序中。而没有这些固件,就会导致硬件部分或全部不能工作。Debian 安装程序可以让用户从 U 盘等加载这些固件,它认为需要将这种情况向用户解释清楚

坚持自由的 Debian 遇到了新的挑战。

PyPI 库中几乎有一半的软件包至少有一个安全问题

研究人员使用静态分析来发现开源软件包的安全问题,这项研究总共扫描了近 20 万个软件包,发现了超过 75 万个安全问题。约 46% 的软件包中发现了至少一个安全问题,最多的是低严重性问题,而 11% 的 PyPI 软件包有 8 万个高严重性问题。

Maven(Java)、NuGet(.NET)、RubyGems(Ruby)、CPAN(Perl)和 CRAN(R)等软件包注册中心的情况也是如此。去年 9 月,一组 IEEE 研究人员分析了 6673 个活跃使用的 Node.js 应用程序,发现大约 68% 的应用程序至少依赖于一个有漏洞的软件包。

公开软件库最被忽视或误解的之一是,它的目的是免费访问、免费提供和免费使用,因此,不会对提供的东西做任何保证。

PowerShell 成为关键安全威胁的首要来源

根据今天在 RSA 大会上发布的思科研究报告,PowerShell 是 2020 年下半年在端点上检测到的关键威胁的首要来源,占比超过了 1/3。PowerShell 成为勒索软件、无文件恶意软件的主要载体。

思科报告显示,端点威胁的首要类别是用于利用及利用后任务的双重用途工具。PowerShell Empire、Metasploit 和其他此类工具有合法用途,但它们也已成为攻击者工具包的一部分。

强力的工具用于恶意用途也是强力的。所以,最起码系统管理员们先将 PowerShell 保护起来吧。

Python 官方软件包库 PyPI 正被垃圾软件包淹没

PyPI 充斥着以流行电影命名的垃圾软件包,其通常与提供盗版下载的盗版网站有关。这些软件包都是由一个独特的假名维护者账户发布的,这使得 PyPI 要一次性删除这些软件包和垃圾账户变得非常困难。除了包含垃圾关键词和视频流网站的链接外,这些软件包还包含从合法的 PyPI 软件包中提取的功能代码和作者信息,以掩盖他们的恶意行为。

近几个月来,对 npm、RubyGems 和 PyPI 等开源生态系统的攻击不断升级。恶意威胁者用各种恶意和伪造的软件包灌满了软件仓库,以传播他们的信息。这成了一场打地鼠比赛。

公开软件库或许需要改变其上传和审核机制,并引入防范垃圾邮件和防止论坛垃圾信息方面的经验。

时隔一年后,Perl 5 发布新版本

将近一年后,Perl 语言宣布发布 Perl 5.34.0。这个版本包含了来自 78 名贡献者的大约 28 万行代码变更。主要变化包括:实验性的 try/catch 语法,正则表达式量词允许空下界,新的八进制语法,性能增强和模块更新等等。

不能说 Perl 语言社区不努力,28 万行代码,这放在任何一个开源项目里都不少。奈何 Perl 语言已经不时髦了,几乎没有人学了,也没有一个独占领域。

PyPI 的 JSON API 是一种机器可直接使用的数据源,你可以访问和你浏览网站时相同类型的数据。

 title=

PyPI(Python 软件包索引)提供了有关其软件包信息的 JSON API。本质上,它是机器可以直接使用的数据源,与你在网站上直接访问是一样的的。例如,作为人类,我可以在浏览器中打开 Numpy 项目页面,点击左侧相关链接,查看有哪些版本,哪些文件可用以及发行日期和支持的 Python 版本等内容:

 title=

但是,如果我想编写一个程序来访问此数据,则可以使用 JSON API,而不必在这些页面上抓取和解析 HTML。

顺便说一句:在旧的 PyPI 网站上,还托管在 pypi.python.org 时,NumPy 的项目页面位于 pypi.python.org/pypi/numpy,访问其 JSON API 也很简单,只需要在最后面添加一个 /json ,即 https://pypi.org/pypi/numpy/json。现在,PyPI 网站托管在 pypi.org,NumPy 的项目页面是 pypi.org/project/numpy。新站点不会有单独的 JSON API URL,但它仍像以前一样工作。因此,你不必在 URL 后添加 /json,只要记住 URL 就够了。

你可以在浏览器中打开 NumPy 的 JSON API URL,Firefox 很好地渲染了数据:

 title=

你可以查看 inforeleaseurls 其中的内容。或者,你可以将其加载到 Python Shell 中,以下是几行入门教程:

import requests
url = "https://pypi.org/pypi/numpy/json"
r = requests.get(url)
data = r.json()

获得数据后(调用 .json() 提供了该数据的 字典),你可以对其进行查看:

 title=

查看 release 中的键:

 title=

这表明 release 是一个以版本号为键的字典。选择一个并查看以下内容:

 title=

每个版本都包含一个列表,release 包含 24 项。但是每个项目是什么?由于它是一个列表,因此你可以索引第一项并进行查看:

 title=

这是一个字典,其中包含有关特定文件的详细信息。因此,列表中的 24 个项目中的每一个都与此特定版本号关联的文件相关,即在 https://pypi.org/project/numpy/1.20.1/#files 列出的 24 个文件。

你可以编写一个脚本在可用数据中查找内容。例如,以下的循环查找带有 sdist(源代码包)的版本,它们指定了 requires_python 属性并进行打印:

for version, files in data['releases'].items():
    for f in files:
        if f.get('packagetype') == 'sdist' and f.get('requires_python'):
            print(version, f['requires_python'])

 title=

piwheels

去年,我在 piwheels 网站上实现了类似的 APIpiwheels.org 是一个 Python 软件包索引,为树莓派架构提供了 wheel(预编译的二进制软件包)。它本质上是 PyPI 软件包的镜像,但带有 Arm wheel,而不是软件包维护者上传到 PyPI 的文件。

由于 piwheels 模仿了 PyPI 的 URL 结构,因此你可以将项目页面 URL 的 pypi.org 部分更改为 piwheels.org。它将向你显示类似的项目页面,其中详细说明了构建的版本和可用的文件。由于我喜欢旧站点允许你在 URL 末尾添加 /json 的方式,所以我也支持这种方式。NumPy 在 PyPI 上的项目页面为 pypi.org/project/numpy,在 piwheels 上,它是 piwheels.org/project/numpy,而 JSON API 是 piwheels.org/project/numpy/json 页面。

没有必要重复 PyPI API 的内容,所以我们提供了 piwheels 上可用内容的信息,包括所有已知发行版的列表,一些基本信息以及我们拥有的文件列表:

 title=

与之前的 PyPI 例子类似,你可以创建一个脚本来分析 API 内容。例如,对于每个 NumPy 版本,其中有多少 piwheels 文件:

import requests

url = "https://www.piwheels.org/project/numpy/json"
package = requests.get(url).json()

for version, info in package['releases'].items():
    if info['files']:
        print('{}: {} files'.format(version, len(info['files'])))
    else:
        print('{}: No files'.format(version))

此外,每个文件都包含一些元数据:

 title=

方便的是 apt_dependencies 字段,它列出了使用该库所需的 Apt 软件包。本例中的 NumPy 文件,或者通过 pip 安装 Numpy,你还需要使用 Debian 的 apt 包管理器安装 libatlas3-baselibgfortran

以下是一个示例脚本,显示了程序包的 Apt 依赖关系:

import requests

def get_install(package, abi):
    url = 'https://piwheels.org/project/{}/json'.format(package)
    r = requests.get(url)
    data = r.json()
    for version, release in sorted(data['releases'].items(), reverse=True):
        for filename, file in release['files'].items():
            if abi in filename:
                deps = ' '.join(file['apt_dependencies'])
                print("sudo apt install {}".format(deps))
                print("sudo pip3 install {}=={}".format(package, version))
                return

get_install('opencv-python', 'cp37m')
get_install('opencv-python', 'cp35m')
get_install('opencv-python-headless', 'cp37m')
get_install('opencv-python-headless', 'cp35m')

我们还为软件包列表提供了一个通用的 API 入口,其中包括每个软件包的下载统计:

import requests

url = "https://www.piwheels.org/packages.json"
packages = requests.get(url).json()
packages = {
    pkg: (d_month, d_all)
    for pkg, d_month, d_all, \*_ in packages
}

package = 'numpy'
d_month, d_all = packages[package]

print(package, "has had", d_month, "downloads in the last month")
print(package, "has had", d_all, "downloads in total")

pip search

pip search 因为其 XMLRPC 接口过载而被禁用,因此人们一直在寻找替代方法。你可以使用 piwheels 的 JSON API 来搜索软件包名称,因为软件包的集合是相同的:

#!/usr/bin/python3
import sys

import requests

PIWHEELS_URL = 'https://www.piwheels.org/packages.json'

r = requests.get(PIWHEELS_URL)
packages = {p[0] for p in r.json()}

def search(term):
    for pkg in packages:
        if term in pkg:
            yield pkg

if __name__ == '__main__':
    if len(sys.argv) == 2:
        results = search(sys.argv[1].lower())
        for res in results:
            print(res)
    else:
        print("Usage: pip_search TERM")

有关更多信息,参考 piwheels 的 JSON API 文档.


本文最初发表在 Ben Nuttall 的 Tooling Tuesday 博客上,经许可转载使用。


via: https://opensource.com/article/21/3/python-package-index-json-apis-requests

作者:Ben Nuttall 选题:lujun9972 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出