当前位置: 首页 > news >正文

探索 Python 应用的分层依赖:解决 UOS 环境中的 libvirt-python 安装问题

  • 探索 Python 应用的分层依赖:解决 UOS 环境中的 libvirt-python 安装问题
    • 背景
    • Python 版本升级
      • 问题描述
      • 原因分析与解决方案
    • Python 应用的分层依赖:安装与部署的视角
    • libvirt-python的分层依赖
    • 尝试的解决方案
      • 使用编译好的 .whl 文件
      • "嫁接"整个package
    • 小结
    • 参考
    • 附录
      • Python 应用分层依赖的完整结构

探索 Python 应用的分层依赖:解决 UOS 环境中的 libvirt-python 安装问题

背景

在 Ubuntu-22.0 和 UOS1070 上用 Python 开发基于 libvrt-python 的应用,在 Ubuntu 平台的开发过程中一切顺利,但在 UOS 上开发时,遇到了两个关键问题:

  1. Python 版本限制:应用需要 Python 3.10 及以上版本,而 UOS 自带的 Python 版本为 3.7.3,因此需要升级 Python 版本。

  2. libvirt-python 包不可用:在 Ubuntu 平台,libvirt-python 包能够正常安装和使用,但在 UOS 上,即使升级了 Python 版本,依然无法成功安装和使用此包,成为开发的主要障碍。

本文将重点分析和解决 libvirt-python 包不可用的问题。在此之前,简单回顾 Python 版本升级的过程。

Python 版本升级

问题描述

UOS 1070 自带的 Python 版本为 3.7.3,但应用需要 Python 3.10 及以上版本。尝试升级 Python 到 3.10.15 版本时,遇到了以下问题:

  • 系统权限限制:UOS 系统默认需要开启“开发者模式”才能使用 sudo 命令安装软件包。
  • 安装失败:即使开启了“开发者模式”,在源码安装 Python 3.10.15 的过程中仍然出现 “Segment Fault” 错误,导致安装失败。

原因分析与解决方案

煎熬了两天,各种搜索未果后,我已经准备上gdb来调试了,偶然获得"高人"指点,发现问题的根源在于 UOS 的应用安全机制1。UOS 默认启用了应用签名限制,只允许运行经过签名的应用程序,即使是编译过程中生成的工具也不允许运行,从而引发了异常。

为了完成 Python 的安装,需要调整安全设置:

开始 —> 安全中心 —> 安全工具 —> 应用安全  

将默认选项 “仅允许签名应用” 修改为 “允许任意应用”。

完成上述步骤后,重新尝试从源码安装 Python 3.10.15 即可成功。

虽然 Python 升级问题解决起来有些“曲折”,但相较于接下来的 libvirt-python 包问题,这只是一个小插曲。接下来将继续复盘如何处理 libvirt-python 包的不可用问题。

Python 应用的分层依赖:安装与部署的视角

在安装和部署 Python 应用时,依赖关系往往分为多个层次。从 Python 包的直接依赖,到系统级的共享库,最终到硬件支持,每一层的正确配置对于成功安装并运行 Python 应用至关重要。特别是在像 UOS 这样的操作系统环境中,理解这些层次关系对于顺利解决诸如 libvirt-python 这样的包安装问题具有重要意义。以下是 Python 应用安装和部署过程中的分层依赖结构:

python call stack

这种依赖关系可以简单归纳如下:

应用层依赖:Python 包及其嵌套依赖(如 scikit-learn 的 numpy 依赖)。

环境层依赖:Python 解释器、包管理工具(pip)及虚拟环境(如 venv)。

二进制层依赖:Python 包中的 C 扩展模块和相关共享库,它们通常以 .so 文件形式存在,运行时候需要正确链接系统共享库。

系统层依赖:系统级共享库(如 glibc)、平台特定库(如 GPU 驱动),它们是二进制模块运行的基础。

硬件与内核层依赖:Linux 内核调用及硬件驱动支持。

接下来,我将基于这一分层模型,详细分析和解决 libvirt-python 的不可用问题。

libvirt-python的分层依赖

libvirt-python2 是一个通过 C 扩展形式实现的 Python 包,用于调用底层 libvirt 库函数,提供对虚拟化管理的接口支持。它的依赖关系横跨 Python 包层二进制层系统层,因此使用过程中容易出现多层依赖之间的兼容性问题。以下对具体报错情况进行分层分析。

libvirt-python 在官方文档中声明了以下编译限制条件:

  • Python 版本:Python >= 3.6
  • libvirt 版本:libvirt >= 0.9.11

虽然这些要求表面上看起来较为宽松,但在 UOS 环境下,安装 libvirt-python 10.8.0(默认就是这个版本)时却出现了以下报错:

$ /usr/local/python3.10/bin/python3 -m pip install libvirt-python
...
Building wheel for libvirt-python (pyproject.toml) did not run successfully.│ exit code: 1╰─> [55 lines of output]running bdist_wheelrunning buildrunning build_pyMissing type converters:virTypedParameterPtr *:1int *:1ERROR: failed virDomainGetLaunchDigest
...

从错误信息中可以看出,问题出现在构建 C 扩展的过程中。libvirt 库的接口通过 /usr/share/libvirt/api/libvirt-api.xml 文件进行定义和描述。而在构建 C 扩展时,libvirt-python 的 generator.py 脚本会检查每个绑定函数的签名是否与 libvirt 库提供的接口匹配。具体问题出在 virDomainGetLaunchDigest 函数,其签名中存在类型不匹配的情况,导致构建失败。

尝试的解决方案

使用编译好的 .whl 文件

针对接口类型检查失败的问题,最直接的解决方案是使用预编译的 .whl 文件安装 libvirt-python。由于实际使用的 API 接口较少,抱着侥幸心理,我尝试将 Ubuntu 22.04 上编译好的 libvirt-python-10.7.0-cp310-cp310-linux_x86_64.whl 文件安装到 UOS 1070 环境中。

安装过程顺利完成,但在 import libvirt 时却报如下错误:

>>> import libvirt
Traceback (most recent call last):File "/home/test/.local/lib/python3.10/site-packages/libvirt.py", line 16, in <module>import cygvirtmod as libvirtmod  # type: ignore
ModuleNotFoundError: No module named 'cygvirtmod'During handling of the above exception, another exception occurred:Traceback (most recent call last):File "<stdin>", line 1, in <module>File "/home/test/.local/lib/python3.10/site-packages/libvirt.py", line 19, in <module>raise lib_eFile "/home/test/.local/lib/python3.10/site-packages/libvirt.py", line 13, in <module>import libvirtmod  # type: ignore
ImportError: /lib/x86_64-linux-gnu/libvirt.so.0: version `LIBVIRT_7.7.0' not found 

翻看代码,这里的逻辑是为了兼容cygwin的环境,先尝试导入cygvirtmod,如果导入失败,则尝试导入libvirtmod。在导入 libvirtmod 的时候,就出现了后续的错误。

进一步定位到 libvirtmod.cpython-310-x86_64-linux-gnu.so 文件,它是 libvirt-python 的C扩展模块,在运行时侯通过 ctypes 或直接绑定的方式与系统的 libvirt.so 动态库交互。如果 libvirt.so 的版本低于 C 扩展模块编译时的要求,缺少必要符号或函数,就会引发上述运行错误。

可以通过以下命令查看 libvirtmod.cpython-310-x86_64-linux-gnu.so 文件中依赖的符号表:

$ strings /home/test/.local/lib/python3.10/site-packages/libvirtmod.cpython-310-x86_64-linux-gnu.so

结果显示,该模块依赖多处 LIBVIRT_7.x.0LIBVIRT_8.0.0 的符号。进一步确认系统环境差异:

Ubuntu 22.04 中的 libvirt 的版本:

test@M920t-N000:~$ virsh --version
8.0.0
test@M920t-N000:~$ ls -lr /usr/lib/x86_64-linux-gnu/libvirt.so
lrwxrwxrwx 1 root root 12  413  2024 /usr/lib/x86_64-linux-gnu/libvirt.so -> libvirt.so.0
test@M920t-N000:~$ ls -lr /usr/lib/x86_64-linux-gnu/libvirt.so.0
lrwxrwxrwx 1 root root 19  413  2024 /usr/lib/x86_64-linux-gnu/libvirt.so.0 -> libvirt.so.0.8000.0 
test@M920t-N000:~$ ls -lr /usr/lib/x86_64-linux-gnu/libvirt.so.0.8000.0
-rw-r--r-- 1 root root 4731576  413  2024 /usr/lib/x86_64-linux-gnu/libvirt.so.0.8000.0

UOS 1070 中的 libvirt 版本:

$ virsh --version
5.0.0

显然,UOS 上的 libvirt.so 版本无法满足 libvirt-python 对 LIBVIRT_7.x.0LIBVIRT_8.0.0 的要求。

升级libvirt的可能

理论上,可以尝试将 UOS 的 libvirt 动态库升级到与 Ubuntu 一致的版本,但升级的工作量和风险极高。以 libvirt-python 的 C 扩展模块为例,其依赖的动态库数量多达 57 个:

test@M920t-N000:~/.pyenv/versions/3.10.14/lib/python3.10/site-packages$ ls -lr
...
-rw-rw-r--  1 test test    6759  913 11:20 libvirt_qemu.py
drwxrwxr-x  2 test test    4096  913 11:20 libvirt_python-10.7.0.dist-info
-rw-rw-r--  1 test test  373128  913 11:20 libvirt.py
-rwxrwxr-x  1 test test   93352  913 11:20 libvirtmod_qemu.cpython-310-x86_64-linux-gnu.so
-rwxrwxr-x  1 test test   81360  913 11:20 libvirtmod_lxc.cpython-310-x86_64-linux-gnu.so
-rwxrwxr-x  1 test test 1041224  913 11:20 libvirtmod.cpython-310-x86_64-linux-gnu.so
-rw-rw-r--  1 test test    1729  913 11:20 libvirt_lxc.py
-rw-rw-r--  1 test test   16957  913 11:20 libvirtaio.py
...
test@M920t-N000:~/.pyenv/versions/3.10.14/lib/python3.10/site-packages$ ldd libvirtmod.cpython-310-x86_64-linux-gnu.so | wc -l
57

动态库的依赖链复杂且紧密,任何库的版本不匹配都会导致问题。例如,以前尝试为某个功能升级库时,不得不更新 glibc 小版本,结果导致系统无法启动。考虑到潜在的工作量和风险,放弃升级 UOS 的 libvirt 动态库,转而寻找其他解决方案。

"嫁接"整个package

从系统本身出发,当前使用的 UOS 1070 系统基于 Debian 10(Buster),系统版本信息如下:

$ cat /etc/debian_version
10.10

在 Debian Buster 的官网3中,发现了它有自己维护的 python3-libvirt 包。通过以下命令可以轻松安装

sudo apt install python3-libvirt

使用 apt install 方式来安装具有以下优势:安装的版本与系统中的 libvirt 保持一致,系统自动处理依赖关系,例如安装 libvirt 动态库 (libvirt.so) 和头文件 (libvirt-dev);通过 apt 安装的包默认与系统中其他依赖保持一致,减少版本冲突的可能性;安装过程非常简单,不需要编译,二进制包直接可用,无需额外配置。

安装完成后,libvirt-python 被默认安装到系统自带的 Python 3.7.3 环境中。

问题转移

虽然 libvirt-python 在 Python 3.7.3 环境中可以被导入和调用,但我们实际需要在 Python 3.10 环境中调用 libvirt-python。此时,我尝试将系统中 Python 3.7.3 的 libvirt-python 包整体“嫁接”到 Python 3.10 的环境中,以解决此问题。

libvirt python hook
  1. 定位并复制系统中的 libvirt-python 包
    首先列出系统中 libvirt-python 的文件内容:
$ ls -lr /usr/lib/python3/dist-packages/libvirt*
-rw-r--r-- 1 root root   3213 124  2019 /usr/lib/python3/dist-packages/libvirt_qemu.py
-rw-r--r-- 1 root root    875 124  2019 /usr/lib/python3/dist-packages/libvirt_python-5.0.0.egg-info
-rw-r--r-- 1 root root 331921 124  2019 /usr/lib/python3/dist-packages/libvirt.py
-rw-r--r-- 1 root root  35000 124  2019 /usr/lib/python3/dist-packages/libvirtmod_qemu.cpython-37m-x86_64-linux-gnu.so
-rw-r--r-- 1 root root  30808 124  2019 /usr/lib/python3/dist-packages/libvirtmod_lxc.cpython-37m-x86_64-linux-gnu.so
-rw-r--r-- 1 root root 306936 124  2019 /usr/lib/python3/dist-packages/libvirtmod.cpython-37m-x86_64-linux-gnu.so
-rw-r--r-- 1 root root   1738 124  2019 /usr/lib/python3/dist-packages/libvirt_lxc.py
-rw-r--r-- 1 root root  15416 124  2019 /usr/lib/python3/dist-packages/libvirtaio.py

然后将上述文件拷贝到 Python 3.10 的 site-packages 目录:

$ cp -r /usr/lib/python3/dist-packages/libvirt* /home/test/.local/lib/python3.10/site-packages/
  1. 重命名 .so 文件以匹配 Python 3.10
    因为 .so 文件是为 Python 3.7 编译的,必须根据 Python 3.10 的命名规则进行重命名:
libvirtmod_qemu.cpython-310-x86_64-linux-gnu.so
libvirtmod_lxc.cpython-310-x86_64-linux-gnu.so
libvirtmod.cpython-310-x86_64-linux-gnu.so
  1. 测试 Python 3.10 环境
    上述调整后,在 Python 3.10 环境中成功加载了 libvirt-python。

这种方法将 Python 3.7 的 libvirt-python 包嫁接到 Python 3.10 环境中,从而绕开了重编译和系统版本冲突的问题。

从调用分层的角度来看,新的方案是在更高一层来解决问题,反倒成为了最简单的解决方案。

小结

通过逐层分析 Python 应用运行环境中的问题,找到了一种简洁且实用的解决方案。libvirt-python 作为一个依赖多层环境的 C 扩展包,其可用性受限于 Python 包管理层、二进制动态库层以及系统底层的协调性。正是这种多层次的依赖关系,导致版本迁移过程中容易出现不匹配问题。

在本次实践中,“嫁接”方案展现了灵活性与高效性,通过直接迁移包的方式,成功让 Python 3.10 环境加载并正常使用 Python 3.7.3 环境中的 libvirt-python。

然而,仍需注意以下几点:

  • 长期可行性:由于“嫁接”方法依赖特定的环境兼容性,可能无法适应未来系统更新或环境变更。
  • 可扩展性与维护成本:如需进一步升级 Python 环境或 libvirt 版本,可能需要重新调整迁移过程。
  • 备选方案评估:若“嫁接”方法失效,可以考虑直接调用 libvirt API,通过绕过 Python 扩展层来解决可用性问题,但这将带来更高的开发成本与复杂性。

所以,当前的“嫁接”方案仅作为快速实现 MVP 的过渡性解决方案。长期来看,为保证系统的稳定性和可维护性,还需要探索新的解决方案。

参考

  1. 统信桌面专业版【安装第三方应用软件时报“段错误”】解决方案
  1. libvirt-python
  1. python3-libvirt

附录

Python 应用分层依赖的完整结构

如果读者需要了解更详细的分层依赖结构,可参考以下说明:

  1. 应用代码层的依赖
  • Python 包依赖:在应用代码中,通过 import 语句引入所需的 Python 包(例如 import os),这是应用最直接的依赖。Python 包的依赖关系在应用的层次上定义,通常列在 requirements.txtpyproject.toml 文件中。
  • 包的嵌套依赖:应用直接依赖的包,通常会进一步依赖其他包。例如,scikit-learn 依赖于 numpyscipy 等。这些嵌套依赖必须全部满足,应用才能正常运行。
  1. Python环境的依赖
  • Python解释器:所有Python代码都依赖于Python解释器,解释器的版本和实现(如CPython、PyPy)影响应用兼容性。一些包(尤其是C扩展包)可能要求特定版本的Python才能正常运行。
  • pip和虚拟环境:pip作为Python包管理器,用于安装、管理Python包。Python虚拟环境(如venv或conda环境)帮助隔离项目之间的依赖,防止包版本冲突。在虚拟环境中安装依赖可以确保应用只使用当前环境中的包。
  1. Python 包的二进制依赖
  • C扩展库:许多Python包(如numpy、PySide6)包含用C/C++编写的底层模块,这些模块在编译后生成二进制共享库(.so文件)。应用依赖的包会加载这些.so文件,比如PySide6.QtWidgets.so。
  • 包的共享库依赖:如果某个Python包的.so文件依赖于其他共享库(例如Qt库libQt5Core.so),那么这些共享库也需要在系统上可用。共享库的路径和版本必须与Python包兼容,否则会出现链接错误(如Symbol not found)。
  1. 系统级库的依赖
  • 共享库(.so)依赖关系:共享库的依赖链可以层层递进。例如,一个Python包的.so文件可能依赖于Qt库,而Qt库又依赖于低层次的库(如X11或OpenGL)。
  • GNU C Library (glibc):几乎所有的Linux共享库最终都会依赖于glibc,这是Linux系统的标准C库,为应用提供底层系统调用和基本功能支持(如内存管理、线程、I/O操作等)。不同版本的glibc存在向后不兼容的情况,因此一些依赖特定版本glibc的.so文件在不同Linux发行版上可能无法兼容。
  1. 内核及硬件依赖
  • Linux内核:应用的最底层依赖是Linux内核,因为所有系统调用(例如内存分配、进程管理等)最终会通过内核执行。现代应用很少直接依赖特定的内核版本,但对于一些底层库(如驱动程序),需要确保内核与应用或库的依赖相符。
  • 硬件支持:在需要硬件加速的场景(如GPU加速)中,系统还依赖于特定的硬件设备和相关驱动程序。这通常是通过内核模块或厂商提供的.so文件(如NVIDIA驱动)实现。

相关文章:

探索 Python 应用的分层依赖:解决 UOS 环境中的 libvirt-python 安装问题

探索 Python 应用的分层依赖&#xff1a;解决 UOS 环境中的 libvirt-python 安装问题 背景Python 版本升级 问题描述原因分析与解决方案 Python 应用的分层依赖&#xff1a;安装与部署的视角libvirt-python的分层依赖尝试的解决方案 使用编译好的 .whl 文件"嫁接"整个…...

OpenCV-平滑图像

二维卷积(图像滤波) 与一维信号一样&#xff0c;图像也可以通过各种低通滤波器&#xff08;LPF&#xff09;、高通滤波器&#xff08;HPF&#xff09;等进行过滤。LPF 有助于消除噪音、模糊图像等。HPF 滤波器有助于在图像中找到边缘。 opencv 提供了函数 **cv.filter2D()**&…...

解决跨域问题方案

跨域问题在前后端分离架构下尤为常见&#xff0c;是每个 Web 开发者都会遇到的核心问题。本文将通过原理解析、场景剖析、解决方案详解以及最佳实践等多个维度&#xff0c;帮助开发者全面理解并有效应对跨域问题。 目录 **一、跨域的本质****1. 同源策略****2. 同源策略的限制范…...

云计算介绍_3(计算虚拟化——cpu虚拟化、内存虚拟化、io虚拟化、常见集群策略、华为FC)

计算虚拟化 1.计算虚拟化介绍1.1 计算虚拟化 分类&#xff08;cpu虚拟化、内存虚拟化、IO虚拟化&#xff09;1.2 cpu虚拟化1.3 内存虚拟化1.4 IO虚拟化1.5 常见的集群的策略1.6 华为FC 1.计算虚拟化介绍 1.1 计算虚拟化 分类&#xff08;cpu虚拟化、内存虚拟化、IO虚拟化&#…...

软件工程复习记录

基本概念 软件工程三要素&#xff1a;方法、工具、过程 软件开发方法&#xff1a;软件开发所遵循的办法和步骤&#xff0c;以保证所得到的运行系统和支持的文档满足质量要求。 软件开发过程管理 软件生命周期&#xff1a;可行性研究、需求分析、概要设计、详细设计、编码、测…...

俩Nim游戏

1.给定n堆石子&#xff0c;每堆石子有xi快&#xff0c;两位玩家轮流操作&#xff0c;每次操作可以从任意一堆石子中拿走任意数量的石子&#xff08;可以拿完&#xff0c;但不能不拿&#xff09;&#xff0c;最后无法进行操作的人视为失败。 问如果两人都采用最优策略&#xff…...

基于超级电容和电池的新能源汽车能量管理系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 超级电容特性 4.2 电池特性 5.完整工程文件 1.课题概述 基于超级电容和电池的新能源汽车能量管理系统simulink建模与仿真。分析不同车速对应的电池&#xff0c;超级电容充放电变化情况。 2.系统仿…...

数据结构——图(遍历,最小生成树,最短路径)

目录 一.图的基本概念 二.图的存储结构 1.邻接矩阵 2.邻接表 三.图的遍历 1.图的广度优先遍历 2.图的深度优先遍历 四.最小生成树 1.Kruskal算法 2.Prim算法 五.最短路径 1.单源最短路径--Dijkstra算法 2.单源最短路径--Bellman-Ford算法 3.多源最短路径--Floyd-…...

002-NoSQL介绍

目录 一、NoSQL 简介 二、NoSQL 特性 三、NoSQL 的工作原理 四、NoSQL 有哪些类型 五、NoSQL数据库与关系型数据库的区别 六、常见的非关系型数据库NOSQL分类 一、NoSQL 简介 NoSQL,全称为Not Only SQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是…...

qt-everywher交叉编译e-src-5.15.2

简化配置的方式&#xff1a; 你完全可以通过直接配置 安装目录、编译链 和 目标架构 来完成交叉编译&#xff0c;而不需要修改 mkspecs 配置。以下是如何通过简化配置来进行交叉编译 Qt 的步骤。 准备交叉编译工具链 首先&#xff0c;确保你已经安装了交叉编译工具链&#xff…...

4.STM32通信接口之SPI通信(含源码)---硬件SPI与W25Q64存储模块通信实战《精讲》

开胃简介 根据上一节对STM32的SPI介绍&#xff01;本节将进行硬件SPI的实现&#xff0c;片选用软件实现&#xff01;跟着Whappy走起&#xff01;W25Q64的驱动层&#xff0c;我们不需要更改&#xff0c;仅仅需要更改一下SPI的协议&#xff0c;即&#xff1a;由软件实现改成硬件…...

生信技能63 - 构建gnomAD变异位点的SQLite查询数据库

将数据量巨大的gnomAD数据库,通过SQLite数据库寻找gnomAD中存在的各种变异注释信息(如等位基因计数,深度,次要等位基因频率等),查询300.000个变量的查询需要大约40秒,通过染色体编号+位置+REF+ALT即可进行快速查询。 1. gnomAD变异注释VCF文件字段 gnomAD VCF各版本包…...

0x0118消息 WM_SYSTIMER

0x0118消息就是WM_SYSTIMER 编辑框出现输入光标时,产生的消息. 0x0118 would be the undocumented WM_SYSTIMER, which appears to be used for caret blinks. 0x0118是一个undocument 消息&#xff0c; 微软没有记录。 但在一些库的源码中可以看到&#xff0c;比如ATL的库文…...

【机器学习】机器学习的基本分类-无监督学习(Unsupervised Learning)

无监督学习&#xff08;Unsupervised Learning&#xff09; 无监督学习是一种机器学习方法&#xff0c;主要用于没有标签的数据集。其目标是从数据中挖掘出潜在的结构和模式。常见的无监督学习任务包括 聚类、降维、密度估计 和 异常检测。 1. 无监督学习的核心目标 1.1 聚类…...

[代码随想录09]字符串2的总结

前言 处理字符串主要是有思路&#xff0c;同时总结方法。 题目链接 151. 反转字符串中的单词 - 力扣&#xff08;LeetCode&#xff09; 55. 右旋字符串&#xff08;第八期模拟笔试&#xff09; 一、翻转字符串里的单词 这个题目的主要思路&#xff0c;代码采用从后往前遍历字…...

java注解(一):什么是注解?什么是元注解?如何自定义注解?注解的原理是什么?

目录 1、什么是注解&#xff1f; 2、什么是元注解 1、Target() 2、Retention() 3、Documented 4、Inherited 3、如何自定义注解以解使用 4、注解的原理 本篇文章主要是介绍注解的概念、原理&#xff0c;以及通过代码演示4种元注解、如何自定义注解。通过反编译的形式进…...

AD20 原理图库更新到原理图

一 点击工具&#xff0c;从库更新。快捷键TL 二 点击完成 三 执行变更&#xff0c;最后点击关闭...

.NET用C#导入Excel数据到数据库

将Excel文件中的数据导入到数据库中不仅能够提升数据处理的效率和准确性&#xff0c;还能极大地促进数据分析和决策制定的过程。尤其在企业级应用中&#xff0c;Excel作为数据输入和初步整理的工具非常普遍&#xff0c;但其功能对于复杂查询、大规模数据管理和跨部门的数据共享…...

小身躯大能量-供热系统通过EtherCAT转Profinet网关进行升级

在现代工业自动化领域&#xff0c;通信技术的进步对于提高系统效率、稳定性和可靠性起着至关重要的作用。EtherCAT&#xff08;Ethernet for Control Automation Technology&#xff09;作为一种实时以太网解决方案&#xff0c;因其高性能及成本效益高等特点&#xff0c;在众多…...

Android11.0系统关闭App所有通知

通过广播接收方式&#xff0c;根据包名关闭App所有通知。 packages/apps/Settings$ git diff diff --git a/AndroidManifest.xml b/AndroidManifest.xml index d4c54c6ed8..1ce7d4136f 100644 --- a/AndroidManifest.xmlb/AndroidManifest.xml-106,6 106,7 <uses-permissio…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析

LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...