标签 python 下的文章

三星 Tizen 应用商城已永久关闭

去年 6 月,三星公司关闭了 Tizen 应用商城的注册,并使商店只对现有用户开放,他们只能获得以前下载的应用程序。在 2021 年 12 月 31 日之后,Tizen 应用商店 永久关闭,不再对新用户和现有用户开放。最后一部运行 Tizen 的手机是三星在 2017 年发布的 Z4 手机。Tizen 公布于 2012 年 2 月,是英特尔 MeeGo 系统与三星 LiMo 系统的混合体。2016 年,Tizen 曾一度是全球第四大手机操作系统。由于三星电视全球巨大的出货量,Tizen 目前仍旧是 第一大电视操作系统

老王点评:又一次反抗 iOS 和安卓统治的努力宣告失败。

TIOBE 宣布年度最佳编程语言是 Python

TIOBE 发布公告宣布了这一消息,该奖项被授予在一年内获得最高评级增长的编程语言。2021 年初,Python 从 TIOBE 指数的第 3 位开始,把 Java 和 C 都甩在身后,成为了 第一名。TIOBE 指数是基于一种编程语言在流行搜索引擎中的搜索结果数量的指数,并不表明最好或最有效率的编程语言,也不衡量整个互联网上用一种语言编写的代码量,并且不考虑非英语语言。

老王点评:这是一个趣味性排行榜,你不应该用这个来指导你学习哪种编程语言。

“快速内核头文件”项目 V2 进一步将构建速度提高了 88%

之前我们 报道过,“快速内核头文件” 项目会清理内核头文件依赖关系,大大加快 Linux 内核的构建速度。它可能会成为 2022 年最伟大的 Linux 内核功能之一。周末,该项目发布了 V2 版本,根据 Linux 5.16-rc8 上游状态进行了重构。值得注意的是,现在也支持用 LLVM Clang 编译器进行编译,这使得内核构建过程加快了 88%! 而之前使用 GCC 编译提升了 77%。

老王点评:积极关注这个项目,就是不知道内核社区对它的看法如何?毕竟牵涉太大了。

Python 中的 Beautiful Soup 库可以很方便的从网页中提取 HTML 内容。

 title=

今天我们将讨论如何使用 Beautiful Soup 库从 HTML 页面中提取内容,之后,我们将使用它将其转换为 Python 列表或字典。

什么是 Web 刮取,为什么我需要它?

答案很简单:并非每个网站都有获取内容的 API。你可能想从你最喜欢的烹饪网站上获取食谱,或者从旅游博客上获取照片。如果没有 API,提取 HTML(或者说 刮取 scraping 可能是获取内容的唯一方法。我将向你展示如何使用 Python 来获取。

并非所以网站都喜欢被刮取,有些网站可能会明确禁止。请于网站所有者确认是否同意刮取。

Python 如何刮取网站?

使用 Python 进行刮取,我们将执行三个基本步骤:

  1. 使用 requests 库获取 HTML 内容
  2. 分析 HTML 结构并识别包含我们需要内容的标签
  3. 使用 Beautiful Soup 提取标签并将数据放入 Python 列表中

安装库

首先安装我们需要的库。requests 库从网站获取 HTML 内容,Beautiful Soup 解析 HTML 并将其转换为 Python 对象。在 Python3 中安装它们,运行:

pip3 install requests beautifulsoup4

提取 HTML

在本例中,我将选择刮取网站的 Techhology 部分。如果你跳转到此页面,你会看到带有标题、摘录和发布日期的文章列表。我们的目标是创建一个包含这些信息的文章列表。

网站页面的完整 URL 是:

https://notes.ayushsharma.in/technology

我们可以使用 requests 从这个页面获取 HTML 内容:

#!/usr/bin/python3
import requests

url = 'https://notes.ayushsharma.in/technology'

data = requests.get(url)

print(data.text)

变量 data 将包含页面的 HTML 源代码。

从 HTML 中提取内容

为了从 data 中提取数据,我们需要确定哪些标签具有我们需要的内容。

如果你浏览 HTML,你会发现靠近顶部的这一段:

<div class="col">
  <a href="/2021/08/using-variables-in-jekyll-to-define-custom-content" class="post-card">
    <div class="card">
      <div class="card-body">
        <h5 class="card-title">Using variables in Jekyll to define custom content</h5>
        <small class="card-text text-muted">I recently discovered that Jekyll's config.yml can be used to define custom
          variables for reusing content. I feel like I've been living under a rock all this time. But to err over and
          over again is human.</small>
      </div>
      <div class="card-footer text-end">
        <small class="text-muted">Aug 2021</small>
      </div>
    </div>
  </a>
</div>

这是每篇文章在整个页面中重复的部分。我们可以看到 .card-title 包含文章标题,.card-text 包含摘录,.card-footer > small 包含发布日期。

让我们使用 Beautiful Soup 提取这些内容。

#!/usr/bin/python3
import requests
from bs4 import BeautifulSoup
from pprint import pprint

url = 'https://notes.ayushsharma.in/technology'
data = requests.get(url)

my_data = []

html = BeautifulSoup(data.text, 'html.parser')
articles = html.select('a.post-card')

for article in articles:

    title = article.select('.card-title')[0].get_text()
    excerpt = article.select('.card-text')[0].get_text()
    pub_date = article.select('.card-footer small')[0].get_text()

    my_data.append({"title": title, "excerpt": excerpt, "pub_date": pub_date})

pprint(my_data)

以上代码提取文章信息并将它们放入 my_data 变量中。我使用了 pprint 来美化输出,但你可以在代码中忽略它。将上面的代码保存在一个名为 fetch.py 的文件中,然后运行它:

python3 fetch.py

如果一切顺利,你应该会看到:

[{'excerpt': "I recently discovered that Jekyll's config.yml can be used to"
"define custom variables for reusing content. I feel like I've"
'been living under a rock all this time. But to err over and over'
'again is human.',
'pub_date': 'Aug 2021',
'title': 'Using variables in Jekyll to define custom content'},
{'excerpt': "In this article, I'll highlight some ideas for Jekyll"
'collections, blog category pages, responsive web-design, and'
'netlify.toml to make static website maintenance a breeze.',
'pub_date': 'Jul 2021',
'title': 'The evolution of ayushsharma.in: Jekyll, Bootstrap, Netlify,'
'static websites, and responsive design.'},
{'excerpt': "These are the top 5 lessons I've learned after 5 years of"
'Terraform-ing.',
'pub_date': 'Jul 2021',
'title': '5 key best practices for sane and usable Terraform setups'},

... (truncated)

以上是全部内容!在这 22 行代码中,我们用 Python 构建了一个网络刮取器,你可以在 我的示例仓库中找到源代码

总结

对于 Python 列表中的网站内容,我们现在可以用它做一些很酷的事情。我们可以将它作为 JSON 返回给另一个应用程序,或者使用自定义样式将其转换为 HTML。随意复制粘贴以上代码并在你最喜欢的网站上进行试验。

玩的开心,继续编码吧。

本文最初发表在作者个人博客上,经授权改编。


via: https://opensource.com/article/21/9/web-scraping-python-beautiful-soup

作者:Ayush Sharma 选题:lujun9972 译者:MjSeven 校对:wxy

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

使用 setuptools 来向用户交付 Python 代码。

 title=

你花了几周的时间来完善你的代码。你已经对它进行了测试,并把它发送给一些亲近的开发者朋友以保证质量。你已经将所有的源代码发布在 你的个人 Git 服务器 上,并且从一些勇敢的早期使用者收到了一些有用的错误报告。现在你已经准备好将你的 Python 代码提供给全世界。

就在这时你遇到一个问题。你不知道如何交付产品。

将代码交付给它的目标用户是一件大事。这是软件开发的一个完整的分支,是 CI/CD 中的 “D”,但很多人都忘记了,至少到最后才知道。我写过关于 AutotoolsCmake 的文章,但有些语言有自己的方法来帮助你将你的代码提供给用户。对于 Python 来说,向用户提供代码的一个常见方法是使用 setuptools

安装 setuptools

安装和更新 setuptools 的最简单方法是使用 pip

$ sudo python -m pip install --upgrade setuptools

示例库

我创建了一个简单的 Python 库,名为 myhellolib,来作为需要打包的示例代码。这个库接受一个字符串,然后用大写字母打印出这个字符串。

它只有两行代码,但项目结构很重要,所以首先创建目录树:

$ mkdir -p myhellolib.git/myhellolib

为了确认这个项目是一个可导入的库(即 Python “模块”),在代码目录中创建一个空文件 __init__.py,同时创建一个包含代码的文件:

$ touch myhellolib.git/myhellolib/__init__.py
$ touch myhellolib.git/myhellolib/myhellolib.py

myhellolib.py 文件中,输入简单的 Python 代码:

def greeter(s):
    print(s.upper())

这就是写好的库。

测试它

在打包之前,测试一下你的库。创建一个 myhellolib.git/test.py 文件并输入以下代码:

import myhellolib.myhellolib as hello
hello.greeter("Hello Opensource.com.")

运行该脚本:

$ cd myhellolib.git
$ python ./test.py
HELLO OPENSOURCE.COM

它可以工作,所以现在你可以把它打包了。

Setuptools

要用 setuptools 打包一个项目,你必须创建一个 .toml 文件,将 setuptools 作为构建系统。将这段文字放在项目目录下的 myhellolib.toml 文件中。

[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"

接下来,创建一个名为 setup.py 的文件,包含项目的元数据:

from setuptools import setup

setup(
   name='myhellolib',
   version='0.0.1',
   packages=['myhellolib'],
   install_requires=[
      'requests',
      'importlib; python_version == "3.8"',
   ],
)

不管你信不信,这就是 setuptools 需要的所有设置。你的项目已经可以进行打包。

打包 Python

要创建你的 Python 包,你需要一个构建器。一个常见的工具是 build,你可以用 pip 安装它:

$ python -m pip install build --user

构建你的项目:

$ python -m build

过了一会儿,构建完成了,在你的项目文件夹中出现了一个新的目录,叫做 dist。这个文件夹包含一个 .tar.gz 和一个 .whl 文件。

这是你的第一个 Python 包! 下面是包的内容:

$ tar --list --file dist/myhellolib-0.0.1.tar.gz
myhellolib-0.0.1/
myhellolib-0.0.1/PKG-INFO
myhellolib-0.0.1/myhellolib/
myhellolib-0.0.1/myhellolib/__init__.py
myhellolib-0.0.1/myhellolib/myhellolib.py
myhellolib-0.0.1/myhellolib.egg-info/
myhellolib-0.0.1/myhellolib.egg-info/PKG-INFO
myhellolib-0.0.1/myhellolib.egg-info/SOURCES.txt
myhellolib-0.0.1/myhellolib.egg-info/dependency_links.txt
myhellolib-0.0.1/myhellolib.egg-info/requires.txt
myhellolib-0.0.1/myhellolib.egg-info/top_level.txt
myhellolib-0.0.1/setup.cfg
myhellolib-0.0.1/setup.py

$ unzip -l dist/myhellolib-0.0.1-py3-none-any.whl 
Archive:  dist/myhellolib-0.0.1-py3-none-any.whl
Name
----
myhellolib/__init__.py
myhellolib/myhellolib.py
myhellolib-0.0.1.dist-info/METADATA
myhellolib-0.0.1.dist-info/WHEEL
myhellolib-0.0.1.dist-info/top_level.txt
myhellolib-0.0.1.dist-info/RECORD
-------
6 files

让它可用

现在你知道了打包你的 Python 包是多么容易,你可以使用 Git 钩子、GitLab Web 钩子、Jenkins 或类似的自动化工具来自动完成这个过程。你甚至可以把你的项目上传到 PyPi,这个流行的 Python 模块仓库。一旦它在 PyPi 上,用户就可以用 pip 来安装它,就像你在这篇文章中安装 setuptoolsbuild 一样!

当你坐下来开发一个应用或库时,打包并不是你首先想到的事情,但它是编程的一个重要方面。Python 开发者在程序员如何向世界提供他们的工作方面花了很多心思,没有比 setuptools 更容易的了。试用它,使用它,并继续用 Python 编码!


via: https://opensource.com/article/21/11/packaging-python-setuptools

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

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

使用 argparse 模块为应用程序设置命令行选项。

 title=

有一些第三方库用于命令行解析,但标准库 argparse 与之相比也毫不逊色。

无需添加很多依赖,你就可以编写带有实用参数解析功能的漂亮命令行工具。

Python 中的参数解析

使用 argparse 解析命令行参数时,第一步是配置一个 ArgumentParser 对象。这通常在全局模块内完成,因为单单\_配置\_一个解析器没有副作用。

import argparse

PARSER = argparse.ArgumentParser()

ArgumentParser 中最重要的方法是 .add_argument(),它有几个变体。默认情况下,它会添加一个参数,并期望一个值。

PARSER.add_argument("--value")

查看实际效果,调用 .parse_args()

PARSER.parse_args(["--value", "some-value"])
Namespace(value='some-value')

也可以使用 = 语法:

PARSER.parse_args(["--value=some-value"])
Namespace(value='some-value')

为了缩短在命令行输入的命令,你还可以为选项指定一个短“别名”:

PARSER.add_argument("--thing", "-t")

可以传入短选项:

PARSER.parse_args("-t some-thing".split())
Namespace(value=None, thing='some-thing')

或者长选项:

PARSER.parse_args("--thing some-thing".split())
Namespace(value=None, thing='some-thing')

类型

有很多类型的参数可供你使用。除了默认类型,最流行的两个是布尔类型和计数器。布尔类型有一个默认为 True 的变体和一个默认为 False 的变体。

PARSER.add_argument("--active", action="store_true")
PARSER.add_argument("--no-dry-run", action="store_false", dest="dry_run")
PARSER.add_argument("--verbose", "-v", action="count")

除非显式传入 --active,否则 active 就是 Falsedry-run 默认是 True,除非传入 --no-dry-run。无值的短选项可以并列。

传递所有参数会导致非默认状态:

PARSER.parse_args("--active --no-dry-run -vvvv".split())
Namespace(value=None, thing=None, active=True, dry_run=False, verbose=4)

默认值则比较单一:

PARSER.parse_args("".split())
Namespace(value=None, thing=None, active=False, dry_run=True, verbose=None)

子命令

经典的 Unix 命令秉承了“一次只做一件事,并做到极致”,但现代的趋势把“几个密切相关的操作”放在一起。

gitpodmankubectl 充分说明了这种范式的流行。argparse 库也可以做到:

MULTI_PARSER = argparse.ArgumentParser()
subparsers = MULTI_PARSER.add_subparsers()
get = subparsers.add_parser("get")
get.add_argument("--name")
get.set_defaults(command="get")
search = subparsers.add_parser("search")
search.add_argument("--query")
search.set_defaults(command="search")
MULTI_PARSER.parse_args("get --name awesome-name".split())
Namespace(name='awesome-name', command='get')
MULTI_PARSER.parse_args("search --query name~awesome".split())
Namespace(query='name~awesome', command='search')`

程序架构

使用 argparse 的一种方法是使用下面的结构:

## my_package/__main__.py
import argparse
import sys

from my_package import toplevel

parsed_arguments = toplevel.PARSER.parse_args(sys.argv[1:])
toplevel.main(parsed_arguments)
## my_package/toplevel.py

PARSER = argparse.ArgumentParser()
## .add_argument, etc.

def main(parsed_args):

    ...

    # do stuff with parsed_args

在这种情况下,使用 python -m my_package 运行。或者,你可以在包安装时使用 console\_scprits 入口点。

总结

argparse 模块是一个强大的命令行参数解析器,还有很多功能没能在这里介绍。它能实现你想象的一切。


via: https://opensource.com/article/21/8/python-argparse

作者:Moshe Zadka 选题:lujun9972 译者:MjSeven 校对:wxy

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

Pine64 宣布最新的 Linux 手机 PinePhone Pro

PinePhone Pro 说是手机有些不确切,从某种意义上来说,它也是一部电脑,是一部运行 Manjaro Linux 的电脑。把它插入显示器,它就是一台低功耗电脑。它所使用的 KDE Plasma Mobile 可以自适应这种手机显示和桌面显示切换的情况。它的主频为 1.5GHz,4GB 内存,128GB 存储。有一个 1300 万像素的主摄像头传感器和一个 500 万像素的前置摄像头,以及一个 6 英寸的 1440 x 720 的 IPS 触摸屏。此外,最重要的是,它提供了绝大多数手机缺少的功能,即硬件的隐私开关,这些藏在后盖的硬件开关可以关闭摄像头、麦克风、Wi-Fi、蓝牙、耳机插孔和 LTE 调制解调器(包括 GPS)等等。最后,它的价格是 399 美元,现在开发者版预定中。

老王点评:真是有点心动啊。

Python 的多线程速度可能大幅提高

Python 长期以来有一个弱点,它无法在多线程环境中很好地扩展。开发者提议 对全局解释器锁(GIL)进行重大修改,重写 Python 在其运行时从多个线程对对象进行序列化访问的方式,将大大提升多线程的性能。这一变化的整体效果略微提高了 10% 的单线程性能。但在多线程情况下,每一个新的线程 几乎是线性扩展的,例如,当使用 20 个线程时,基准测试中加速了 18.1 - 19.8 倍。

老王点评:要是多线程的性能能解决,那就真是一大胜利了。

佳能被控在打印机缺墨时人为禁用扫描和传真功能

佳能美国公司现在面临着一起 集体诉讼,指控称,“尽管该打印机被宣传为具有三种不同的功能 —— 打印、复印和扫描,但却都没有警告说所有这些功能都需要墨水。因为在扫描时没有对墨水的实际需要,佳能这样做只是为了增加利润,因此该公司是在进行不当得利的行为。”目前该诉讼还没有被批准为集体诉讼,但如果它被批准并胜诉,任何佳能打印机的买家都可能获得赔偿。

老王点评:凭啥没墨你就不让扫描?

Firefox 93 在地址栏显示广告

Firefox 的 URL 地址栏已不再满足于在用户输入时通过浏览器历史记录来提供相关建议,而是引入了来自“可信赖合作伙伴”的“相关建议”与“赞助建议”。通俗地说,就是你在地址栏输入 URL 时会 显示广告!在用户启用输入建议时,键盘按下信息会被送到 Mozilla;在点击了建议链接后,该链接会被反馈给 Mozilla;此外,用户的地理位置也会发给 Mozilla。Mozilla 声称这么做有助于 Firefox 的后续开发与优化,说它会“非常保守地处理这些数据”。需要补充的是,这个输入建议功能可以被关闭。

老王点评:连谷歌都不敢这样干啊!

Python 登顶 TIOBE 排行榜

TIOBE 指数宣布,“20 多年来,我们第一次有了一个新的领导者 …… Java 和 C 的长期霸权已经结束。”Python 之父 Guido 对此说:“我想感谢整个 Python 社区,是他们让 Python 如此成功。” Python 胜出主要是其他语言的搜索量下降而不是 Python 上升的结果。它的搜索份额为 11.27%,与去年 10 月持平。虽然这些年数据科学的兴起及其机器学习软件库的生态系统为它提供了源源不断的动力。

另外,Python 3.10 刚刚发布,这是从 Python 2 过渡以来的第一个重要版本。其中一个重要的功能是引入“结构模式匹配”,这种处理数据的技术已经在 C、Java、JavaScript 中使用。此外还有提供用于调试的更精确和可靠的行号,以及管道操作符的重载等。

老王点评:Python 已经是一种必备技能了,像我这种早些年用 Perl 人对此真是羡慕的很。

微软再次改进了 Windows Linux 子系统(WSL)

在 Windows 10 和 11 上,WSL 的部署过程已显著简化,可以通过 wsl --installwsl --update 更快地安装和更新系统。而之前大约需要 3 到 4 个步骤才能启用 WSL。用户可以在 WSL 中安装图形应用程序,让它们与 Windows 应用程序一起运行,并且支持 GPU 加速的 3D 图形及音频。

老王点评:我看相当一部分 Linux 桌面用户会被吸引到 WSL 上。