当前位置: 首页 > 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 文件"嫁接"整个…...

【MySQL 进阶之路】表级锁、行级锁详解

1. 表级锁和行级锁的概念及区别 表级锁&#xff08;Table Lock&#xff09; 表锁是一种较为粗粒度的锁&#xff0c;锁定的是整个表。当某个事务加锁表时&#xff0c;其他事务对该表的任何读写操作都会被阻塞&#xff0c;直到锁被释放。因此&#xff0c;表锁具有较高的冲突概率…...

FPGA系列,文章目录

前言 FPGA&#xff08;Field-Programmable Gate Array&#xff0c;现场可编程门阵列&#xff09;是一种集成电路&#xff0c;其内部结构可以通过软件重新配置来实现不同的逻辑功能。与传统的ASIC&#xff08;Application-Specific Integrated Circuit&#xff0c;专用集成电路…...

离谱的梯形滤波器——增加过渡点

增加过渡点 频率采样法&#xff08;Frequency Sampling Method&#xff09;是一种设计FIR滤波器的方法&#xff0c;通过在频域中指定希望的频率响应&#xff0c;然后利用逆离散傅里叶变换&#xff08;IDFT&#xff09;来获得滤波器的脉冲响应。然而&#xff0c;这种方法容易导…...

容积卡尔曼滤波(CKF)仿真抛物线运动

容积卡尔曼滤波&#xff08;CKF&#xff09;仿真抛物线运动 容积卡尔曼滤波&#xff08;Cubature Kalman Filter, CKF&#xff09;的MATLAB实现。CKF是一种用于非线性系统状态估计的算法&#xff0c;它通过在状态空间中采样点&#xff08;容积点&#xff09;来近似非线性函数的…...

FlightGear+MATLAB+飞行手柄实现实时飞控视景系统

文章目录 一、软件配置二、FlightGearMATLAB联合仿真第一步 复制文件第二步 新建文件夹第三步 打开demo第四步 demo说明第五步 打开Simulink第六步 连接FlightGear第七步 设置FlightGear第八步 生成FlightGear连接文件FlightGear的设置Network的设置File的设置生成.bat文件 第九…...

Oracle 11g Data Guard 环境中的 GAP 处理办法

概述 在Data Guard 环境中&#xff0c;当主库的某些日志没有成功传送到备库时&#xff0c;就会发生归档裂缝&#xff08;Archive Gap&#xff09;。目前&#xff0c;Oracle 提供了两种日志 GAP 的检测和处理机制&#xff1a;自动 GAP 处理&#xff08;Automatic Gap Resolutio…...

自建服务器,数据安全有保障

在远程桌面工具的选择上&#xff0c;向日葵和TeamViewer功能强大&#xff0c;但都存在收费昂贵、依赖第三方服务器、数据隐私难以完全掌控等问题。相比之下&#xff0c;RustDesk 凭借开源免费、自建服务的特性脱颖而出&#xff01;用户可以在自己的服务器上部署RustDesk服务端&…...

华为HarmonyOS 快速构建各种文本识别应用 -- 通用文字识别

适用场景 通用文字识别&#xff0c;是通过拍照、扫描等光学输入方式&#xff0c;将各种票据、卡证、表格、报刊、书籍等印刷品文字转化为图像信息&#xff0c;再利用文字识别技术将图像信息转化为计算机等设备可以使用的字符信息的技术。 可以对文档翻拍、街景翻拍等图片进行…...

shell作业

计算器 #!/bin/bash num1$1 num2$3 op$2 case $op in"")echo $((num1 num2));;"-")echo $((num1 - num2));;"*")echo $((num1 * num2));;"/")if [ $num2 -ne 0 ]; thenecho $((num1 / num2))elseecho "除数不能为0"fi;;*)…...

css部分

前面我们学习了HTML&#xff0c;但是HTML仅仅只是做数据的显示&#xff0c;页面的样式比较简陋&#xff0c;用户体验度不高&#xff0c;所以需要通过CSS来完成对页面的修饰&#xff0c;CSS就是页面的装饰者&#xff0c;给页面化妆&#xff0c;让它更好看。 1 层叠样式表&#…...

nginx 配置 跨域、压缩、文件下载 、静态文件、防盗链

1.跨域配置 在server模块下 访问如&#xff1a;http://127.0.0.1:8080/static/a.txt #跨域server {listen 8080;server_name localhost;#允许跨域请求的域&#xff0c; *代表所有add_header Access-Control-Allow-Origin *;#允许带上cookie请求add_header Access-Contro…...

SQL教程(1):什么是SQL?有什么用?

如果你是刚接触用户研究的新手&#xff0c;可能会听说过一个词叫做 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;&#xff0c;但你可能还不太清楚它是什么&#xff0c;如何使用它&#xff0c;或者为什么它会对你的用户研究有帮助。别担心&…...

c++笔记2

14、c的对象 对象和结构的区别&#xff1b; 结构&#xff1a;包含各种类型的变量&#xff1b; 对象&#xff1a;包含各种函数、和变量&#xff1b; 设计对象的时候引用class关键字创建类&#xff0c;和结构形状差不多&#xff1b; 将变量称之为属性&#xff0c;函数称之为方…...

Xlsxwriter生成Excel文件时TypeError异常处理

在使用 XlsxWriter 生成 Excel 文件时&#xff0c;如果遇到 TypeError&#xff0c;通常是因为尝试写入的值或格式与 XlsxWriter 的限制或要求不兼容。 1、问题背景 在使用 Xlsxwriter 库生成 Excel 文件时&#xff0c;出现 TypeError: “expected string or buffer” 异常。此…...

应用层协议/传输层协议(UDP)

目录 应用层 如何自定义应用层协议&#xff1f; 序列化方式 1.基于行文本的方式来传输 2.基于xml的方式 3.基于json的方式 4.yml的形式 5.protobuffer(pb)形式 传输层 端口号 协议 UDP 校验和 CRC TCP TCP/IP五层协议 应用层 -- 传输层 -- 网络层 -- 数据链路层…...

【Linux】应用层协议—HTTP

一、HTTP协议介绍 请求-响应模型&#xff1a;HTTP (Hyper Text Transfer Protocol) 协议是基于请求和响应的。客户端&#xff08;如Web浏览器&#xff09;发送一个HTTP请求到服务器&#xff0c;服务器处理请求后返回一个HTTP响应。 无状态&#xff0c;无连接协议&#xff1a;H…...

使用Vue3+Echarts实现加载中国地图,点击省份地图下钻(完整教程)

一. 前言 在众多 ECharts 图表类型中&#xff0c;开发者始终绕不开的有各种各样的地图开发&#xff0c;关于地图开发&#xff0c;可能比其他图表相对繁琐一些&#xff0c;其实说简单也简单&#xff0c;说复杂也复杂&#xff0c;其中不乏有层级地图、3D 地图等&#xff0c;感觉…...

双目相机的标定,视差图,深度图,点云生成思路与实现。

该文档记录从双目相机标定到点云生成的所有过程&#xff0c;同时会附上代码。 代码直接能跑。https://github.com/stu-yzZ/stereoCamera 目录 大致思路如下&#xff1a; 一、相机标定 1、相机参数介绍 2、单目相机标定 3、双目相机标定 二、图片畸变矫正 三、极线矫正…...

解决 minio上传文件Service: S3, Status Code: 403

错误信息 [software.amazon.awssdk.services.s3.model.S3Exception: (Service: S3, Status Code: 403, Request ID: 180E9BC04F11312E, Extended Request ID: 81aefed089495c5faf6270c59bea93c9783926f74ef647fe6b17908f0976b557)]分析过程 4XX一般是客户端错误。403表示禁止…...

SpringBoot实战——个人博客项目

目录 一、项目简介 ?二、项目整体架构 数据库模块 后端模块 前端模块 ?三、项目具体展示 ?四、项目的具体实现 1、一些准备工作 ??数据库、数据表的创建 ??设置数据库和MyBatis的配置 ??将前端项目引入到当前项目中 2、登录注册模块 ??实体类的创建 ?…...

OpenCV-平滑图像

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

nodejs官方文档学习-笔记-1

一、异步工作 process.nextTick()&#xff1a; 回调会在当前操作完成后立即执行&#xff0c;但在事件循环进入下一个阶段之前。它是最先执行的。 Promise.then()&#xff1a; 回调会在 microtask 队列中执行&#xff0c;通常是在当前操作完成后&#xff0c;但在事件循环进入…...

YOLOv7

YOLOv7 是 YOLO 系列的一个重要版本&#xff0c;由 Chien-Yao Wang 和 Alexey Bochkovskiy 等研究人员和开发者提出&#xff0c;继续改进了 YOLOv4 和 YOLOv5 的设计&#xff0c;主要在模型性能、训练效率以及推理速度上进行优化。YOLOv7 进一步优化了 YOLO 系列在速度和精度之…...

汉语唤醒词的模糊判断(Python)

汉语唤醒词的模糊判断【Python】 说明安装库代码Demo其他 说明 这是一个简单的汉语模糊唤醒词的判断器&#xff0c;汉语发音中前后舌以及声母韵母的区别&#xff0c;如果进行精准判断&#xff0c;很容易误判。需要一个模糊判断的逻辑! 安装库 pip install pypinyin代码Demo …...

C语言实例_26之根据输入计算星期几

1. 问题 请输入星期几的第一个字母来判断一下是星期几&#xff0c;如果第一个字母一样&#xff0c;则继续判断第二个字母。 2. 实现思路 思路一&#xff1a;嵌套if-else语句实现 首先接收用户输入的第一个字母&#xff0c;使用if-else语句进行判断。如果输入的是M&#xff0…...

包管理器npm,cnpm,yarn和pnpm

npm (Node Package Manager) 核心技术与工作原理 依赖解析&#xff1a; 广度优先搜索&#xff08;BFS&#xff09;&#xff1a;npm 使用 BFS 算法来解析依赖树&#xff0c;尽量扁平化 node_modules 目录以减少重复的依赖项。冲突处理&#xff1a;如果两个包需要同一个依赖的不…...

docker-compose部署skywalking 8.1.0

一、下载镜像 #注意 skywalking-oap-server和skywalking java agent版本强关联&#xff0c;版本需要保持一致性 docker pull elasticsearch:7.9.0 docker pull apache/skywalking-oap-server:8.1.0-es7 docker pull apache/skywalking-ui:8.1.0二、部署文件docker-compose.yam…...

Android -- [SelfView] 自定义多行歌词滚动显示器

Android – [SelfView] 自定义多行歌词滚动显示器 流畅、丝滑的滚动歌词控件* 1. 背景透明&#xff1b;* 2. 外部可控制进度变化&#xff1b;* 3. 支持屏幕拖动调节进度&#xff08;回调给外部&#xff09;&#xff1b;效果 歌词文件&#xff08;.lrc&#xff09; 一. 使用…...

记事本建java及java命名规范

1.桌面开发&#xff1a;c# 2. 记事本建java&#xff1a; 以class的名称(类名)为名&#xff0c;名称.java 编译jdk&#xff1a;javac 名称.java 调动运行jre : java 名称 查看名称.java里面的内容&#xff1a;cat 名称.java java 的命名规范 大驼峰&#xff08;每个单词首…...

Elasticsearch scroll 之滚动查询

Elasticsearch scroll 之滚动查询 Elasticsearch 的 Scroll API 是一种用于处理大规模数据集的机制&#xff0c;特别是在需要从索引中检索大量数据时。通常情况下&#xff0c;Elasticsearch 的搜索请求会有一个结果集大小的限制 (fromsize 的检索数量默认是 10,000 条记录)&am…...

cartographer建图与定位应用

文章目录 前言一、安装cartographer1.安装环境2.源码编译2.1 下载2.2 编译 二、gazebo仿真2d建图0.准备仿真环境1.编写lua文件2.编写启动文件3.建图保存 三、cartographer定位 move_base导航3.1 编写启动文件3.2 启动launch 总结 前言 本文介绍cartographer在ubuntu18.04下的…...

CEEMDAN-CPO-VMD二次分解(CEEMDAN+冠豪猪优化算法CPO优化VMD)

CEEMDAN-CPO-VMD二次分解&#xff08;CEEMDAN冠豪猪优化算法CPO优化VMD&#xff09; 目录 CEEMDAN-CPO-VMD二次分解&#xff08;CEEMDAN冠豪猪优化算法CPO优化VMD&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 首先运用CEEMDAN对数据进行一次分解&#xff…...

【Golang】Go语言编程思想(二):函数式编程

函数式编程 函数与闭包 支持函数式编程的语言当中&#xff0c;函数是一等公民&#xff0c;参数、变量、返回值都可以是函数。 以 adder 为例&#xff0c;下例实现了一个函数式编程&#xff1a; package mainimport "fmt"func adder() func(int) int {sum : 0retu…...

ros项目dual_arm_pick-place(moveit和gazebo联合仿真)(一)

目录 前言正文创建功能包具体代码运行 总结 前言 dual_arm_pick-place项目中&#xff0c;实现了两套的moveit和gazebo联合仿真。 启动文件分别是bringup_moveit.launch和arm_bringup_moveit.launch。 在这个项目中&#xff0c;我将代码重新创建了一个包&#xff0c;co_simula…...

点线面|点到两点直线距离求解

在点云库&#xff08;PCL&#xff09;中&#xff0c;计算点到直线的距离可以借助于向量运算。以下是这种计算方法的步骤以及相应的实现代码。 概念 要计算点 AA 到通过点 BB 和 CC 定义的直线的距离&#xff0c;可以使用以下步骤&#xff1a; 定义两个向量&#xff1a; 向量 …...

等保2.0三级测评华为华三交换机路由器

在使用本博客提供的学习笔记及相关内容时,请注意以下免责声明: 信息准确性:本博客的内容是基于作者的个人理解和经验,尽力确保信息的准确性和时效性,但不保证所有信息都完全正确或最新。 非专业建议:博客中的内容仅供参考,不能替代专业人士的意见和建议。在做出任何重要…...

鸿蒙分享(二):引入zrouter路由跳转+封装

码仓库&#xff1a;https://gitee.com/linguanzhong/share_harmonyos 鸿蒙api:12 鸿蒙第三方库地址&#xff1a;OpenHarmony三方库中心仓 zrouter地址&#xff1a;OpenHarmony三方库中心仓 1.引入zrouter 1.打开终端界面&#xff1a;输入 ohpm install hzw/zrouter 2.在项目…...

欧拉角和旋转矩阵之间的转换

在实际编程实践中&#xff0c;特别是使用C的Eigen库时&#xff0c;需要掌握多种空间旋转表示之间的转换。本文将深入探讨欧拉角与旋转矩阵之间的相互转换&#xff0c;这是使用库时常见的操作。 首先&#xff0c;让我们了解欧拉角。它是指通过围绕三个基本坐标轴旋转来表示三维对…...

Typora的激活

Typora的安装、激活 图文教程 | 2024年最新Typora激活使用教程合集 Typora 激活指南&#xff08;2024年最新版&#xff09; 图文教程 | 2024Typora最新版免费激活使用教程&#xff08;新旧版可用&#xff09;...

排查bug的通用思路

⭐️前言⭐️ APP点击某个按钮没有反应/PC端执行某个操作后&#xff0c;响应较慢&#xff0c;通用的问题排查方法: 从多个角度来排查问题 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评…...

探秘CSS3 3D转换:打造立体网页动画与视觉效果的魔法

在现代网页设计中&#xff0c;CSS3 3D转换&#xff08;3D Transforms&#xff09;已经成为一种强大的工具&#xff0c;用于创建各种动态效果和视觉吸引力。本文将详细介绍CSS3 3D转换的基本概念、常见属性及其应用示例&#xff0c;帮助您掌握这一技术&#xff0c;提升网页设计的…...

Pycharm 安装两种不同版本的解释器

背景 Pycharm使用的解释器是python3.11&#xff0c;python3.9.x之后不支持win7&#xff1b;有同事需要在win7上使用python制作的exe&#xff0c;而了“win7环境下运行python打包exe提示找不到api-ms-win-core-path-l1-1-0.dll”。 过程 查找了一些资料&#xff0c;发现直接将…...

小红薯x-s算法分析最新12-06(x-s 56)(上)

目标-小红薯达人作品&#xff1a;aHR0cHM6Ly93d3cueGlhb2hvbmdzaHUuY29tLw 1、确定目标 打上xhr断点 发现是异步请求&#xff0c;同时各个参数已经生成结束了 2、进入第二个异步函数 打上断点并继续运行 发现在e这个位置也生成了&#xff0c;那么再继续往上找异步参数进行断…...

视频融合×室内定位×数字孪生

随着物联网技术的迅猛发展&#xff0c;室内定位与视频融合技术在各行各业中得到了广泛应用。不仅能够提供精确的位置信息&#xff0c;还能通过实时视频监控实现全方位数据的可视化。 与此同时&#xff0c;数字孪生等技术的兴起为智慧城市、智慧工厂等应用提供了强大支持&#…...

JMS和消息中间件:Kafka/RocketMQ

文章目录 消息传递模型使用JMS还是KafkaKafka与RocketMQ的优缺点Kafka与RocketMQ的使用场景Kafka与RocketMQ的选型指南 TPM 项目中&#xff0c; iflow之间使用了JMS&#xff0c;后端项目与数据库通信使用Kafka MQ和JMS的区别&#xff1a; JMS是 java 用来处理消息的一个API规范…...

FreeRTOS之ARM CR5栈结构操作示意图

FreeRTOS之ARM CR5栈结构操作示意图 1 FreeRTOS源码下载地址2 ARM CR5栈结构操作宏和接口2.1 portSAVE_CONTEXT宏2.1.1 portSAVE_CONTEXT源码2.1.2 portSAVE_CONTEXT宏操作栈结构变化示意图 2.2 portRESTORE_CONTEXT宏2.2.1 portRESTORE_CONTEXT源码2.2.2 portRESTORE_CONTEXT宏…...

【技巧】Mac上如何显示键盘和鼠标操作

在制作视频教程时&#xff0c;将键盘和鼠标的操作在屏幕上显示出来&#xff0c;会帮助观众更容易地理解。 推荐Mac上两款开源的小软件。 1. KeyCastr 这款工具从2009年至今一直在更新中。 https://github.com/keycastr/keycastr 安装的话&#xff0c;可以从Github上下载最…...

三种插入排序算法

目录 1.直接插入排序 直接插入排序的步骤示例 直接插入排序的特点 适用场景 2.折半插入排序 折半插入排序的基本原理 折半插入排序的实现过程 折半插入排序的时间复杂度 折半插入排序的特点 3.希尔排序 希尔排序的基本原理 希尔排序的步骤举例 希尔排序的时间复杂…...

力扣100题--移动零

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […...