网易首页 > 网易号 > 正文 申请入驻

客观对比Python所有的依赖环境管理工具

0
分享至

△△请给“Python猫”加星标 ,以免错过文章推送

你好,我是猫哥。分享过一则《对 Python 环境和包管理工具的公正分析》,这里分享一篇译文。

原文: https://alpopkes.com/posts/python/packaging_tools 译文: https://juejin.cn/post/7325611798135767090 译者:hashcon 作者在 EuroPython 2023 上的演讲: https://www.youtube.com/watch?v=3-drZY3u5vo 译者做的视频翻译版本: https://www.bilibili.com/video/BV1EC4y1C7f8
背景知识

当我开始使用 Python 并创建我的第一个包时,我很困惑。创建和管理包似乎比我预想的要困难得多。此外,存在多种工具,但我不确定该使用哪一种。我相信你们大多数人过去都遇到过同样的问题。Python 有无数的工具来管理虚拟环境和创建包,但很难(或几乎不可能)了解哪一个适合您的需求。存在一些关于该主题的演讲和博客文章,但它们都没有给出完整的概述或以结构化的方式评估这些工具。这就是这篇文章的主题。

工具分类

本文划分五个对于环境和包管理方面很重要的类别:

  • Python 版本管理

  • 包管理

  • 环境管理(主要涉及虚拟环境)

  • 包构建

  • 包发布

让我们从开发人员的角度来浏览一下这些类别:假设您同时处理个人项目和工作项目。在工作中,您使用的是 Python 3.7,而您的个人项目应该使用最新的 Python 版本(当前为 3.11)。换句话说:您希望能够安装不同的 Python 版本并在它们之间进行切换。这就是我们的第一个类别,Python 版本管理的内容。

在您的项目中,您正在使用其他软件包(例如 pandas 或 sklearn 用于数据科学)。这些是您必须安装和管理的项目的依赖项(例如,在发布新版本时进行升级)。这就是包管理的意义所在。

由于不同的项目可能需要同一包的不同版本,因此您需要创建(和管理)虚拟环境以避免依赖冲突。用于此目的的工具收集在环境管理类别中。大多数工具使用虚拟环境,但有些工具使用另一个称为 “本地包”(Local Packages) 的概念,我们稍后会讨论。

您可能希望与其他开发人员共享您的代码。为此,您首先必须构建包(包构建),然后才能将其发布到 PyPI 或其他索引(包发布)。

下面我们将更详细地了解每个类别,包括简短的定义、动机和可用的工具。我将在最后的单独部分中更详细地介绍一些单一用途工具和一些多用途工具。我们先从第一类开始:Python 版本管理。

Python版本管理 定义

一个可以进行 Python 版本管理的工具,可以让你轻松安装 Python 版本并在它们之间切换。

动机

为什么我们要使用不同的 Python 版本?有几个原因。例如,您可能正在处理多个项目,其中每个项目都需要不同的 Python 版本。或者,您可能开发一个支持多个 Python 版本的项目,并且想要测试所有版本。除此之外,检查最新的 Python 版本所提供的功能,或者测试 Python 的预发布版本是否存在错误也是不错的选择。

工具

我们的维恩图显示了可用于 Python 版本管理的工具:pyenv, conda, rye 和 PyFlow。我们将首先在单独的部分中查看 pyenv 并考虑多用途工具。

Python 自带一个单一用途的工具,可让您安装和管理 Python 版本:pyenv!Pyenv 很容易使用。最重要的命令如下:

# 安装特定版本的 Python
pyenv install 3.10.4

# 在不同的 Python 版本之间切换

# 仅针对当前 shell 切换 Python 版本
pyenv shell
# 在这个目录下,自动使用某个 Python 版本
pyenv local
# 针对当前用户,全局设定 Python 版本
pyenv global

(虚拟)环境管理 定义

环境管理工具,允许您创建和管理(虚拟)环境。

动机

为什么我们首先要使用环境?正如一开始提到的,项目有特定的要求(即它们依赖于其他包)。通常情况下,不同的项目需要同一包的不同版本。这可能会导致依赖冲突。此外,使用 pip install 安装包时可能会出现问题,因为该包与系统范围的 Python 安装一起放置。其中一些问题可以通过使用命令 --user 中的标志来解决。然而,这个选项可能并不是每个人都知道,尤其是初学者。

工具

许多工具允许用户创建和管理环境。它们是:venv, virtualenv, pipenv, conda, pdm, poetry, hatch, rye 和 PyFlow。其中只有两个是单一用途工具:venv 和 virtualenv。让我们先来看看这两个:

venv(docs.python.org/3/library/v…) 是用于创建虚拟环境的内置 Python 包。最重要的命令如下:

# 创建一个新的环境
python3 -m venv

# 使用这个环境
. /bin/activate

# 关闭这个环境
deactivate
virtualenv

virtualenv (virtualenv.pypa.io/en/latest/)尝试改进 venv. 它提供的功能更多,速度更快,功能更强大。最重要的命令与 venv 基本一样:

# 创建一个新环境
virtualenv

# 启用这个环境
. /bin/activate

# 关闭这个环境
deactivate

包管理 pyproject.toml

在我们讨论打包之前,我想确保您了解打包最重要的文件:pyproject.toml.

Python 的打包已经取得了长足的进步,在 PEP 518 之前,setup.py 文件用于打包,setuptools 作为构建工具。PEP 518 引入了 pyproject.toml 文件的用法。因此,在创建包时始终需要一个 pyproject.toml 文件,用于定义项目的设置、定义元数据和许多其他内容。一个示例是 pandas 的 pyproject.toml 文件:

github.com/pandas-dev/…

[build-system]
# Minimum requirements for the build system to execute.
# See https://github.com/scipy/scipy/pull/12940 for the AIX issue.
requires = [
"meson-python==0.13.1",
"meson==1.2.1",
"wheel",
"Cython==3.0.5", # Note: sync with setup.py, environment.yml and asv.conf.json
# Any NumPy version should be fine for compiling. Users are unlikely
# to get a NumPy<1.25 so the result will be compatible with all relevant
# NumPy versions (if not it is presumably compatible with their version).
# Pin <2.0 for releases until tested against an RC. But explicitly allow
# testing the `.dev0` nightlies (which require the extra index).
"numpy>1.22.4,<=2.0.0.dev0",
"versioneer[toml]"

build-backend = "mesonpy"

[project]
name = 'pandas'
dynamic = [
'version'
]
description = 'Powerful data structures for data analysis, time series, and statistics'
readme = 'README.md'
authors = [
{ name = 'The Pandas Development Team', email='pandas-dev@python.org' },
]
license = {file = 'LICENSE'}
requires-python = '>=3.9'
dependencies = [
"numpy>=1.22.4; python_version<'3.11'",
"numpy>=1.23.2; python_version=='3.11'",
"numpy>=1.26.0; python_version>='3.12'",
"python-dateutil>=2.8.2",
"pytz>=2020.1",
"tzdata>=2022.7"
]
classifiers = [
# 省略后续
.lock 文件

还有一个对于打包很重要的文件:锁定文件(xxx.lock)。pyproject.toml 包含抽象依赖关系,锁定文件包含具体依赖关系。它记录了为项目安装的所有依赖项的确切版本(例如pandas==2.0.3)。这使得项目在多个平台上具有可重复性,例如下面的 github.com/python-poet…:

# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.

[[package]]
name = "build"
version = "1.0.3"
description = "A simple, correct Python build frontend"
optional = false
python-versions = ">= 3.7"
files = [
{file = "build-1.0.3-py3-none-any.whl", hash = "sha256:589bf99a67df7c9cf07ec0ac0e5e2ea5d4b37ac63301c4986d1acb126aa83f8f"},
{file = "build-1.0.3.tar.gz", hash = "sha256:538aab1b64f9828977f84bc63ae570b060a8ed1be419e7870b8b4fc5e6ea553b"},
]

[package.dependencies]
colorama = {version = "*", markers = "os_name == \"nt\""}
importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""}
packaging = ">=19.0"
pyproject_hooks = "*"
tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}

[package.extras]
docs = ["furo (>=2023.08.17)", "sphinx (>=7.0,<8.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)", "sphinx-issues (>=3.0.0)"]
test = ["filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0)", "setuptools (>=56.0.0)", "setuptools (>=56.0.0)", "setuptools (>=67.8.0)", "wheel (>=0.36.0)"]
typing = ["importlib-metadata (>=5.1)", "mypy (>=1.5.0,<1.6.0)", "tomli", "typing-extensions (>=3.7.4.3)"]
virtualenv = ["virtualenv (>=20.0.35)"]
定义

包管理工具能够下载和安装库及其依赖项。

动机

为什么我们需要包?包允许我们定义模块的层次结构并使用"."语法,例如from package.module import my_function轻松访问模块。此外,它们还可以轻松地与其他开发人员共享代码。由于每个包都包含一个 pyproject.toml 定义其依赖项的文件,因此其他开发人员不必单独安装所需的包,而只需从其 pyproject.toml 文件中安装该包即可。

工具

许多工具可以执行包管理:pip, pipx, pipenv, conda, pdm, poetry, rye 和 PyFlow.

其中,pip 可能是最众所周知的,它也是这里的专门只用来做包管理的工具。

Python 的标准包管理器是 pip(pip.pypa.io/en/stable/),它随 Python 一起提供,并允许您从 PyPI 和其他索引安装包。主要命令(可能是 Python 开发人员学习的第一个命令之一)是pip install

多用途工具

接下来进入非单一用途的工具

pipenv

顾名思义,pipenv 结合了 pip 和 virtualenv。它可以执行虚拟环境管理和包管理,正如我们在维恩图中看到的那样:

pipenv 引入两个附加文件:

  • Pipfile:是一个 toml 文件(类似于 pyproject.toml),用于定义项目依赖项

  • Pipfile.lock:允许确定性构建。它消除了对 requirements.txt 文件的需要,并通过锁定操作自动管理。

最重要的pipenv命令是:

# 安装某个包
pipenv install

# 在虚拟环境运行某个脚本
pipenv run

# 启用虚拟环境
pipenv shell
Conda

Conda 是一个通用的包管理系统。这意味着它不限于 Python 包。Conda 是一个具有很多功能的巨大工具。存在很多教程和博客文章(例如官方的),因此我不会在这里详细介绍。但是,我想提一件事:虽然可以构建和发布包,但 conda 我没有将该工具包含在适当的类别中。这是因为打包的 conda 工作方式略有不同,并且生成的包将是 conda 包。

接下来我将比较不同工具的以下维度的特点:

  • 该工具是否管理依赖关系?

  • 它是否解析/锁定依赖关系?

  • 是否有干净的构建/发布流程?

  • 它允许使用插件吗?

  • 它支持 PEP 660(可编辑安装:peps.python.org/pep-0660/)吗?PEP 660 是关于基于构建的可编辑安装 pyproject.toml。当您使用安装软件包时,pip 您可以选择使用pip install -e package_name来以可编辑模式安装它。当您开发包并希望您的更改直接反映在您的环境中时,这是一个重要的功能。

  • 它支持 PEP 621(项目元数据:peps.python.org/pep-0621/)吗?PEP 621 指定如何在 pyproject.toml 文件中写入项目的核心元数据。我添加这个评判维度是因为一个包(剧透:它是 poetry)当前不支持此 PEP,但使用自己的方式来声明元数据。

Flit

Flit(flit.pypa.io/en/stable/)尝试创建一种简单的方法将 Python 包和模块放在 PyPI 上。它有一个非常具体的用例:它旨在用于打包纯 Python 包(即没有构建步骤的包)。它不关心任何其他任务:

  • Python版本管理:❌

  • 包管理:❌

  • 环境管理:❌

  • 构建包:✅

  • 发布包:✅

这也反映在我们的维恩图中:

该工具是否管理依赖关系?❌

  • 它是否解析/锁定依赖关系?❌

  • 是否有干净的构建/发布流程?✅

  • 它允许使用插件吗?❌

  • 它支持 PEP 660 吗?✅

  • 它支持 PEP 621 吗?✅

  • 主要命令有:

    # 创建新的 pyproject.toml
    flit init

    # 构建并发布
    flit publish
    Poetry

    Poetry 是众所周知的工具。正如维恩图中所示,它可以执行除 Python 版本管理之外的所有操作:

    • Python版本管理:❌

    • 包管理:✅

    • 环境管理:✅

    • 构建包:✅

    • 发布包:✅

    Poetry 不支持 PEP 621。GitHub 上关于此问题的开放问题已有大约 1.5 年的时间,但还是没有解决(github.com/python-poet…)。

    • 该工具是否管理依赖关系?✅

    • 它是否解析/锁定依赖关系?✅

    • 是否有干净的构建/发布流程?✅

    • 它允许使用插件吗?✅

    • 它支持 PEP 660 吗?✅

    • 它支持 PEP 621 吗?❌

    主要命令:

    # 创建目录结构和 pyproject.toml
    poetry new

    # 交互式创建 pyproject.toml
    poetry init

    # 从 pyproject.toml 安装依赖
    poetry install

    依赖管理:

    # Add dependency
    poetry add

    # Display all dependencies
    poetry show --tree
    运行代码
    # Activate virtual env
    poetry shell

    # Run script within virtual env
    poetry run python

    锁定文件:首次安装软件包时,Poetry 会解析 pyproject.toml 文件中列出的所有依赖项并下载最新版本的软件包。一旦 Poetry 完成安装,它将所有包和下载的确切版本写入一个 poetry.lock 文件,将项目锁定到这些特定版本。建议将锁定文件提交到您的项目存储库,以便所有从事该项目的人员都被锁定到相同版本的依赖项。要将依赖项更新到最新版本,请使用以下命令:

    poetry update

    构建/发布流程:

    # 打包 (创建 `.tar.gz` 和 `.whl`)
    poetry build

    # 发布到 PyPI
    poetry publish
    pdm

    pdm 是一个相对较新的包和依赖项管理器(于 2019 年开始),受到 Poetry 和 PyFlow 的启发。您会注意到,我在本文中并没有讨论 PyFlow。这是因为 PyFlow 不再活跃,这不再适合快速发展的打包工具领域。作为一种新工具,pdm 需要 Python 3.7 或更高版本。与其他工具的另一个区别是 pdm 允许用户选择构建后端。

    pdm 是唯一在本地包上实现 PEP 582 的工具(除 PyFlow 之外) ,这是实现环境管理的替代方法。请注意,此 PEP 最近被拒绝了。

    从维恩图中可以看出,pdm 位于 Poetry 旁边。这意味着它可以做除 Python 版本管理之外的所有事情:

    Python版本管理:❌

  • 包管理:✅

  • 环境管理:✅

  • 构建包:✅

  • 发布包:✅

  • pdm 的主要命令与 poetry 类似。然而,目前的命令还是比较少。例如,目前没有 pdm shell 或 pdm new

    • 该工具是否管理依赖关系?✅

    • 它是否解析/锁定依赖关系?✅

    • 是否有干净的构建/发布流程?✅

    • 它允许使用插件吗?✅

    • 它支持 PEP 660 吗?✅

    • 它支持 PEP 621 吗?✅

    创建一个新项目

    # 交互式创建 pyproject.toml
    pdm init

    # 从 pyproject.toml 安装包
    pdm install

    依赖管理

    # 添加依赖
    pdm add

    # 展示所有依赖
    pdm list --graph

    运行代码

    # 没有 shell 命令

    # 使用当前环境运行
    pdm run python

    锁定文件:pdm 的锁定功能与 poetry 类似。首次安装软件包时,pdm 会解析 pyproject.toml 文件中列出的所有依赖项并下载最新版本的软件包。pdm 完成安装后,会将所有包及其下载的确切版本写入文件中 pdm.lock,从而将项目锁定到这些特定版本。建议将锁定文件提交到您的项目存储库,以便所有从事该项目的人员都被锁定到相同版本的依赖项。要将依赖项更新到最新版本,请使用以下命令:

    pdm update

    构建/发布流程:

    # 打包 (创建 `.tar.gz` 和 `.whl`)
    pdm build

    # 发布到 PyPI
    pdm publish
    Hatch

    Hatch(hatch.pypa.io/latest/):

    • Python版本管理:❌

    • 包管理:❌

    • 环境管理:✅

    • 构建包:✅

    • 发布包:✅

    值得注意的是,Hatch 的作者承诺将很快添加锁定功能(github.com/pypa/hatch/…)。当您阅读本文时,请务必检查 Hatch 的最新版本,看看是否已实现此功能。

    该工具是否管理依赖关系?❌

  • 它是否解析/锁定依赖关系?❌

  • 是否有干净的构建/发布流程?✅

  • 它允许使用插件吗?✅

  • 它支持 PEP 660(可编辑安装)吗?✅

  • 它支持 PEP 621(项目元数据)吗?✅

  • 创建一个新项目

    # 创建目录结构以及 pyproject.toml
    hatch new

    # 交互式创建项目
    hatch new -i

    # 初始化现有项目或者创建 pyproject.toml
    hatch new --init

    依赖管理

    # 没有 add 命令,依赖需要手动添加到 pyproject.toml

    # 展示依赖
    hatch dep show table

    运行代码

    # 启用虚拟环境
    hatch shell

    # 在虚拟环境运行脚本
    hatch run python

    构建/发布流程

    # 打包 (创建 `.tar.gz` 和 `.whl`)
    hatch build

    # 发布到 PyPI
    hatch publish

    声明式环境管理:Hatch 的特别之处在于它允许您在文件中配置虚拟环境 pyproject.toml。此外,它还允许您专门为环境定义脚本。示例用例是代码格式化(hatch.pypa.io/1.1/config/…)。

    Rye

    Rye 最近由 Flask 框架的创建者 Armin Ronacher 开发(首次发布于 2023 年 5 月)。它受到编程语言 Rust 的打包工具 rustup 和 cargo 的强烈启发。Rye 是用 Rust 编写的,能够执行维恩图中的所有任务:

    Python版本管理:✅

  • 包管理:✅

  • 环境管理:✅

  • 构建包:✅

  • 发布包:✅

  • 目前,Rye 没有插件接口。但是,由于定期发布新版本,因此将来可能会添加此内容。

    • 该工具是否管理依赖关系?✅

    • 它是否解析/锁定依赖关系?✅

    • 是否有干净的构建/发布流程?✅

    • 它允许使用插件吗?❌

    • 它支持 PEP 660(可编辑安装)吗?✅

    • 它支持 PEP 621(项目元数据)吗?✅

    创建一个新项目:

    # 创建目录结构以及 pyproject.toml
    rye init

    # 指定一个 Python 本本
    rye pin 3.10

    依赖管理:

    # 添加依赖,但是还没有安装
    rye add

    # 同步虚拟环境, 锁定文件等等
    # 在这个步骤安装依赖
    rye sync

    运行代码:

    # 启动虚拟环境
    rye shell

    # 使用虚拟环境运行脚本
    rye run python

    构建/发布流程:

    # 打包 (创建 `.tar.gz` 和 `.whl`)
    rye build

    # 发布到 PyPI
    rye publish

    总结

    Flit Poetry pdm Hatch rye 该工具是否管理依赖关系 ❌ ✅ ✅ ❌ ✅ 它是否解析/锁定依赖关系 ❌ ✅ ✅ ❌ ✅ 是否有干净的构建/发布流程 ✅ ✅ ✅ ✅ ✅ 它允许使用插件吗 ❌ ✅ ✅ ✅ ❌ 它支持 PEP 660(可编辑安装)吗 ✅ ✅ ✅ ✅ ✅ 它支持 PEP 621(项目元数据)吗 ✅ ❌ ✅ ✅ ✅

    如果你觉得本文有帮助

    特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

    Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

    相关推荐
    热点推荐
    表面老艺术家,私下贪财又好色,这几位晚节不保一点都不冤

    表面老艺术家,私下贪财又好色,这几位晚节不保一点都不冤

    舍长阿爷谈事
    2026-06-22 12:17:00
    俄乌战争打了4年多,中国终于明白:统一台湾前,这3种人必铲除

    俄乌战争打了4年多,中国终于明白:统一台湾前,这3种人必铲除

    谭麤爱搞笑
    2026-06-07 09:21:42
    太沉重了!一张殡仪馆的电子显示屏8位逝者,有6人未能活到55岁

    太沉重了!一张殡仪馆的电子显示屏8位逝者,有6人未能活到55岁

    火山詩话
    2026-06-12 08:54:20
    卡里克看懵了!曼联不起眼的边缘人 世界杯直接带队出线!

    卡里克看懵了!曼联不起眼的边缘人 世界杯直接带队出线!

    澜归序
    2026-06-22 07:49:04
    志愿军侦察班抓回1名韩军营长,师政委看到后却愣住:怎么是你?

    志愿军侦察班抓回1名韩军营长,师政委看到后却愣住:怎么是你?

    云霄纪史观
    2026-06-20 02:25:10
    普京为何对莫斯科遇袭事件保持沉默一位专家指出了一个有趣的方面

    普京为何对莫斯科遇袭事件保持沉默一位专家指出了一个有趣的方面

    魅力乌克兰
    2026-06-22 02:53:59
    贝克汉姆14岁的女儿小七怎么如此成熟了,好像少妇

    贝克汉姆14岁的女儿小七怎么如此成熟了,好像少妇

    西楼知趣杂谈
    2026-06-13 19:52:21
    丢人丢到全亚洲,马来西亚媒体都来嘲讽新加坡:反应这么大干嘛?

    丢人丢到全亚洲,马来西亚媒体都来嘲讽新加坡:反应这么大干嘛?

    阿莱美食汇
    2026-06-22 08:06:37
    长沙偶遇王诗龄一家,瘦下来的李湘气质终于不土了,看着也就30岁

    长沙偶遇王诗龄一家,瘦下来的李湘气质终于不土了,看着也就30岁

    柒佰娱
    2026-06-22 09:41:22
    三大指数集体翻绿,沪指下跌0.32%

    三大指数集体翻绿,沪指下跌0.32%

    每日经济新闻
    2026-06-22 09:44:07
    八兵团司令刘汝明向蒋纬国献计:我有一个办法,可以救出黄维兵团

    八兵团司令刘汝明向蒋纬国献计:我有一个办法,可以救出黄维兵团

    史之铭
    2026-06-22 01:20:41
    世界杯黑马抢人!C 罗儿子也能为佛得角踢球!英格兰虎视眈眈

    世界杯黑马抢人!C 罗儿子也能为佛得角踢球!英格兰虎视眈眈

    澜归序
    2026-06-22 11:42:48
    台风“米克拉”加强为强台风级 我国部分海域阵风可达10至11级

    台风“米克拉”加强为强台风级 我国部分海域阵风可达10至11级

    环球网资讯
    2026-06-22 12:42:33
    3.8吨!撞人伤害翻倍,保护自己仅多16%!中国电车为何越造越大?

    3.8吨!撞人伤害翻倍,保护自己仅多16%!中国电车为何越造越大?

    趣味萌宠的日常
    2026-06-07 02:53:27
    洪秀柱当众痛批郑丽文上任半年路线跑偏,国民党彻底陷入两难困局

    洪秀柱当众痛批郑丽文上任半年路线跑偏,国民党彻底陷入两难困局

    完善法
    2026-06-21 11:18:46
    所有人都追电车,丰田说不——它赌对了

    所有人都追电车,丰田说不——它赌对了

    摸鱼算法
    2026-06-21 00:58:16
    突尼斯0-4出局后,日本队32强对手浮现,有4种可能,大概率踢巴西

    突尼斯0-4出局后,日本队32强对手浮现,有4种可能,大概率踢巴西

    小火箭爱体育
    2026-06-21 15:06:05
    34岁周冬雨无戏可拍原因很简单,不是因为年纪大,也不是片酬高

    34岁周冬雨无戏可拍原因很简单,不是因为年纪大,也不是片酬高

    东方不败然多多
    2026-06-22 13:27:39
    任式楠先生逝世,系江苏无锡人

    任式楠先生逝世,系江苏无锡人

    极目新闻
    2026-06-22 11:39:10
    结束19年婚姻5个月后,凯斯·厄本公开为前妻妮可·基德曼庆生

    结束19年婚姻5个月后,凯斯·厄本公开为前妻妮可·基德曼庆生

    陈意小可爱
    2026-06-22 11:18:19
    2026-06-22 13:55:00
    Python猫 incentive-icons
    Python猫
    人生苦短,我用Python。博客:https://pythoncat.top
    731文章数 8120关注度
    往期回顾 全部

    科技要闻

    智谱盘中狂飙超40%,市值破万亿港元

    头条要闻

    南派三叔新剧上线10分钟被盗版 还遭盗版者私信嘲笑

    头条要闻

    南派三叔新剧上线10分钟被盗版 还遭盗版者私信嘲笑

    体育要闻

    法国球星祝中国队下届世界杯取得好成绩

    娱乐要闻

    韩红帮冯小刚宣传,结果翻车了…

    财经要闻

    “床垫界的特斯拉”破产了

    汽车要闻

    全面提升 全新理想L8 livis将家用舒适再进化

    态度原创

    家居
    亲子
    手机
    本地
    公开课

    家居要闻

    绿意盎然 自然之境

    亲子要闻

    毒尿裤受害婴儿名单曝光!最小仅有7天,体内毒性物质严重超标

    手机要闻

    从串行到并行 vivo X Fold6原子工作台解放移动生产力

    本地新闻

    龙腾资江 韵动邵阳

    公开课

    李玫瑾:为什么性格比能力更重要?

    无障碍浏览 进入关怀版