Python之pip图形化(GUI界面)辅助管理工具
Python之pip图形化(GUI界面)辅助管理工具
pip 是 Python 的包管理工具,用于安装、管理、更新和卸载 Python 包(模块)。用于第三方库的安装和管理过程,是 Python 开发中不可或缺的工具。
包的安装、更新、卸载,查看,特别是当用户安装有多个版本的Python时,为特定版本进行这些操作。还可以使用镜像加速安装。
默认情况下,pip 会从 PyPI 下载包。如果你在中国大陆,可能会因为网络问题导致下载速度较慢。可以设置使用国内的镜像源。
有关详情可见:https://blog.csdn.net/cnds123/article/details/104393385
对于新手而言,还是比较麻烦的。
为此,提供一个pip图形化(GUI界面)辅助管理工具
首先搜索出电脑上安装的python版本及路径放在列表中,用户点击哪个就列出哪个版本中已安装的包。所有耗时操作添加了操作前的提示信息,并在操作结束后显示明确的结果。
“列出python”按钮,提供计算机中安装所有python版本(含路径)
“安装包”按钮,提供对话框输入包名进行安装
“包卸载”按钮,可卸载选中的Python包
“包升级”按钮,可升级选中的Python包到最新版本
“镜像源”按钮,出现内置清华、阿里云、腾讯云和官方源等多个镜像源,用于选择
“刷新”按钮,用于列表中显示刚刚安装的包
运行效果如下:
这个工具,利用了多个模块/包/库:
sys(提供与 Python 解释器强相关的功能)、os(提供操作系统相关功能)、subprocess(用于运行外部命令或程序)、json(用于处理 JSON 数据)、shutil(提供文件和文件集合的高级操作)、datetime (用于处理日期和时间),这些都是 Python 的标准库,不需要安装。
PyQt6 是一个功能强大的 GUI 框架,适用于开发复杂的桌面应用程序。通过安装 PyQt6,你可以导入其中的模块来构建用户界面。
源码如下:
import sys
import os
import subprocess
import json
import shutil
from datetime import datetime# PyQt6模块导入
from PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QPushButton, QVBoxLayout, QHBoxLayout,QListWidget, QListWidgetItem, QLabel, QDialog, QFormLayout, QLineEdit,QDialogButtonBox, QMessageBox, QTextEdit, QRadioButton, QButtonGroup,QStatusBar, QSplitter
)
from PyQt6.QtCore import Qt, QSize
from PyQt6.QtGui import QColorclass PipManager(QMainWindow):"""PIP图形化管理工具主窗口类"""def __init__(self):super().__init__()# 窗口基本设置self.setWindowTitle('Python PIP图形化管理工具 — V 1.0.1')self.setGeometry(100, 100, 800, 600)# 初始化成员变量self.python_installations = [] # 存储Python安装信息self.current_python = None # 当前选中的Pythonself.installed_packages = [] # 当前Python已安装的包self.current_mirror = None # 当前使用的镜像源# 初始化镜像源配置self.mirrors = {"清华": "https://pypi.tuna.tsinghua.edu.cn/simple","阿里云": "https://mirrors.aliyun.com/pypi/simple","腾讯云": "https://mirrors.cloud.tencent.com/pypi/simple","官方源": "https://pypi.org/simple"}# 初始化UIself.init_ui()# 加载配置self.load_config()# 显示欢迎信息self.info_text.setText("欢迎使用Python PIP图形化管理工具\n\n""请点击「列出Python」按钮扫描系统中的Python安装\n""或者直接选择上方列表中的Python版本开始管理")# 加载Python安装列表self.find_python_installations()def init_ui(self):"""初始化用户界面组件"""# 创建主窗口部件main_widget = QWidget()self.setCentralWidget(main_widget)# 主布局main_layout = QVBoxLayout()main_widget.setLayout(main_layout)# 上方部分 - Python版本列表python_group = QWidget()python_layout = QVBoxLayout()python_group.setLayout(python_layout)python_label = QLabel('已安装的Python列表')python_layout.addWidget(python_label)self.python_list = QListWidget()self.python_list.itemClicked.connect(self.on_python_selected)python_layout.addWidget(self.python_list)main_layout.addWidget(python_group)# 按钮工具栏button_layout = QHBoxLayout()self.list_python_btn = QPushButton('列出Python')self.list_python_btn.clicked.connect(self.find_python_installations)button_layout.addWidget(self.list_python_btn)self.install_pkg_btn = QPushButton('安装包')self.install_pkg_btn.clicked.connect(self.install_package)button_layout.addWidget(self.install_pkg_btn)self.uninstall_pkg_btn = QPushButton('卸载包')self.uninstall_pkg_btn.clicked.connect(self.uninstall_package)button_layout.addWidget(self.uninstall_pkg_btn)self.upgrade_pkg_btn = QPushButton('升级包')self.upgrade_pkg_btn.clicked.connect(self.upgrade_package)button_layout.addWidget(self.upgrade_pkg_btn)self.mirror_btn = QPushButton('设置镜像源')self.mirror_btn.clicked.connect(self.show_mirror_dialog)button_layout.addWidget(self.mirror_btn)self.refresh_btn = QPushButton('刷新')self.refresh_btn.clicked.connect(self.refresh_package_list)button_layout.addWidget(self.refresh_btn)main_layout.addLayout(button_layout)# 下方分割区域:包列表和信息显示splitter = QSplitter(Qt.Orientation.Horizontal)# 左侧 - 已安装包列表package_group = QWidget()package_layout = QVBoxLayout()package_group.setLayout(package_layout)package_label = QLabel('已安装的包列表')package_layout.addWidget(package_label)self.package_list = QListWidget()self.package_list.itemClicked.connect(self.show_package_info)package_layout.addWidget(self.package_list)splitter.addWidget(package_group)# 右侧 - 信息日志info_group = QWidget()info_layout = QVBoxLayout()info_group.setLayout(info_layout)info_label = QLabel('信息日志')info_layout.addWidget(info_label)self.info_text = QTextEdit()self.info_text.setReadOnly(True)info_layout.addWidget(self.info_text)splitter.addWidget(info_group)# 设置分割比例splitter.setSizes([300, 300])main_layout.addWidget(splitter)# 状态栏self.status_bar = QStatusBar()self.setStatusBar(self.status_bar)# 显示当前镜像源self.mirror_label = QLabel('镜像源: 未设置')self.status_bar.addPermanentWidget(self.mirror_label)# 显示当前Python版本self.python_label = QLabel('Python: 未选择')self.status_bar.addPermanentWidget(self.python_label)# 初始状态self.status_bar.showMessage('准备就绪', 3000)def load_config(self):"""加载配置文件"""config_path = os.path.expanduser('~/.pip-multi-gui-config')try:# 尝试加载配置文件if os.path.exists(config_path):with open(config_path, 'r', encoding='utf-8') as f:config = json.load(f)self.current_mirror = config.get('current_mirror')if self.current_mirror:self.mirror_label.setText(f'镜像源: {self.get_mirror_name(self.current_mirror)}')except Exception as e:QMessageBox.warning(self, '配置错误', f'加载配置文件失败: {str(e)}')def save_config(self):"""保存配置文件"""config_path = os.path.expanduser('~/.pip-multi-gui-config')config = {'current_mirror': self.current_mirror}try:with open(config_path, 'w', encoding='utf-8') as f:json.dump(config, f, ensure_ascii=False, indent=4)except Exception as e:QMessageBox.warning(self, '配置错误', f'保存配置文件失败: {str(e)}')def get_mirror_name(self, url):"""根据URL获取镜像源名称"""for name, mirror_url in self.mirrors.items():if mirror_url == url:return namereturn '自定义源'def _get_startupinfo(self):"""获取隐藏命令窗口的startupinfo对象"""if sys.platform.startswith('win'):startupinfo = subprocess.STARTUPINFO()startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOWstartupinfo.wShowWindow = subprocess.SW_HIDEreturn startupinforeturn Nonedef find_python_installations(self):"""查找系统中安装的所有Python版本"""self.python_installations = []self.python_list.clear()# 添加日志提示self.info_text.clear()self.info_text.append("正在扫描系统中的Python安装,请稍候...\n")QApplication.processEvents() # 立即更新UItry:# 在Windows系统上查找Python安装if sys.platform == 'win32':self._find_windows_pythons()# 在Unix/Linux/Mac系统上查找Python安装else:self._find_unix_pythons()# 更新UIfor python in self.python_installations:item = QListWidgetItem(f"{python['version']} ({python['path']})")self.python_list.addItem(item)# 添加结果日志self.info_text.append(f"扫描完成,找到 {len(self.python_installations)} 个Python安装\n")for i, python in enumerate(self.python_installations, 1):self.info_text.append(f"{i}. {python['version']} - {python['path']}")# 如果有Python安装,选择第一个if self.python_installations:self.python_list.setCurrentRow(0)self.on_python_selected(self.python_list.item(0))self.status_bar.showMessage(f'找到 {len(self.python_installations)} 个Python安装', 3000)except Exception as e:self.info_text.append(f"扫描失败: {str(e)}")QMessageBox.critical(self, '错误', f'查找Python安装失败: {str(e)}')def _find_windows_pythons(self):"""查找Windows上的Python安装"""# 可能的Python安装路径possible_paths = []# 检查Program Filesprogram_files = [os.environ.get('ProgramFiles', 'C:\\Program Files'),os.environ.get('ProgramFiles(x86)', 'C:\\Program Files (x86)')]# 添加用户目录下的AppData\Localuser_profile = os.environ.get('USERPROFILE', '')if user_profile:program_files.append(os.path.join(user_profile, 'AppData', 'Local'))# 查找Python目录for base_dir in program_files:if os.path.exists(base_dir):for item in os.listdir(base_dir):if item.lower().startswith('python'):python_dir = os.path.join(base_dir, item)possible_paths.append(python_dir)# 添加系统PATH中的Pythonfor path in os.environ.get('PATH', '').split(os.pathsep):if 'python' in path.lower():possible_paths.append(path)# 检查每个可能的路径for path in possible_paths:python_exe = os.path.join(path, 'python.exe')if os.path.exists(python_exe):self._add_python_installation(python_exe)def _find_unix_pythons(self):"""查找Unix/Linux/Mac上的Python安装"""# 常见的Python可执行文件名python_executables = ['python', 'python3', 'python2']# 使用which命令查找Pythonfor exe in python_executables:try:result = subprocess.run(['which', exe], capture_output=True, text=True, check=False)if result.returncode == 0 and result.stdout.strip():self._add_python_installation(result.stdout.strip())except Exception:pass# 检查常见安装位置common_paths = ['/usr/bin', '/usr/local/bin', '/opt/local/bin','/Library/Frameworks/Python.framework/Versions']for base_path in common_paths:if os.path.exists(base_path):for item in os.listdir(base_path):if any(item.startswith(exe) for exe in python_executables):python_path = os.path.join(base_path, item)if os.path.isfile(python_path) and os.access(python_path, os.X_OK):self._add_python_installation(python_path)def _add_python_installation(self, python_path):"""添加Python安装到列表"""try:# 获取Python版本result = subprocess.run([python_path, '--version'],capture_output=True, text=True, check=False,startupinfo=self._get_startupinfo())if result.returncode == 0:version = result.stdout.strip() or result.stderr.strip()# 检查是否已存在相同路径for existing in self.python_installations:if existing['path'] == python_path:returnself.python_installations.append({'path': python_path,'version': version})except Exception:passdef on_python_selected(self, item):"""处理Python选择事件"""if not item:returnindex = self.python_list.row(item)if 0 <= index < len(self.python_installations):self.current_python = self.python_installations[index]self.python_label.setText(f"Python: {self.current_python['version']}")self.refresh_package_list()def refresh_package_list(self):"""刷新当前Python的已安装包列表"""if not self.current_python:QMessageBox.warning(self, '警告', '请先选择一个Python版本')return# 添加日志提示self.info_text.clear()self.info_text.append(f"正在获取 {self.current_python['version']} 的已安装包列表...\n")QApplication.processEvents() # 立即更新UItry:# 执行pip list命令获取已安装包result = subprocess.run([self.current_python['path'], '-m', 'pip', 'list', '--format=json'],capture_output=True, text=True, check=False,startupinfo=self._get_startupinfo())if result.returncode == 0:# 解析JSON结果self.installed_packages = json.loads(result.stdout)self.update_package_list_display()# 更新日志self.info_text.append(f"成功获取 {len(self.installed_packages)} 个已安装的包\n")self.info_text.append("选择左侧列表中的包可查看详细信息")self.status_bar.showMessage('包列表刷新成功', 3000)else:error_msg = result.stderr.strip() or '未知错误'raise Exception(error_msg)except Exception as e:self.info_text.append(f"获取包列表失败: {str(e)}")QMessageBox.critical(self, '错误', f'获取包列表失败: {str(e)}')self.status_bar.showMessage('获取包列表失败', 3000)def update_package_list_display(self):"""更新包列表显示"""self.package_list.clear()# 按名称排序sorted_packages = sorted(self.installed_packages, key=lambda x: x['name'].lower())# 添加到列表控件for pkg in sorted_packages:item = QListWidgetItem(f"{pkg['name']}=={pkg['version']}")self.package_list.addItem(item)def show_package_info(self, item):"""显示选中包的详细信息"""if not item:returnpkg_name = item.text().split('==')[0]# 添加日志提示self.info_text.clear()self.info_text.append(f"正在获取 {pkg_name} 的详细信息...\n")QApplication.processEvents() # 立即更新UItry:# 执行pip show命令获取包详情result = subprocess.run([self.current_python['path'], '-m', 'pip', 'show', pkg_name],capture_output=True, text=True, check=False,startupinfo=self._get_startupinfo())if result.returncode == 0:self.info_text.clear()self.info_text.append(f"== {pkg_name} 详细信息 ==\n")self.info_text.append(result.stdout)else:raise Exception(result.stderr.strip() or '未知错误')except Exception as e:self.info_text.append(f"获取包信息失败: {str(e)}")def install_package(self):"""安装Python包"""if not self.current_python:QMessageBox.warning(self, '警告', '请先选择一个Python版本')return# 创建自定义对话框dialog = QDialog(self)dialog.setWindowTitle('安装包')layout = QFormLayout()# 包名输入框pkg_name_edit = QLineEdit()layout.addRow('包名:', pkg_name_edit)# 版本号输入框version_edit = QLineEdit()version_edit.setPlaceholderText('可选,如: 1.0.0')layout.addRow('版本号:', version_edit)# 确定和取消按钮btn_box = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel)btn_box.accepted.connect(dialog.accept)btn_box.rejected.connect(dialog.reject)layout.addRow(btn_box)dialog.setLayout(layout)if dialog.exec() == QDialog.DialogCode.Accepted:pkg_name = pkg_name_edit.text().strip()version = version_edit.text().strip()if not pkg_name:QMessageBox.warning(self, '警告', '包名不能为空')return# 显示使用的镜像源信息mirror_info = ""if self.current_mirror:mirror_info = f"\n镜像源: {self.get_mirror_name(self.current_mirror)}"# 确认安装confirm = QMessageBox.question(self, '确认安装',f'确定要安装 {pkg_name}{"=="+version if version else ""} 吗?{mirror_info}',QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)if confirm == QMessageBox.StandardButton.Yes:self.run_pip_command('install', pkg_name, version=version)def uninstall_package(self):"""卸载Python包"""if not self.current_python:QMessageBox.warning(self, '警告', '请先选择一个Python版本')returnselected_item = self.package_list.currentItem()if not selected_item:QMessageBox.warning(self, '警告', '请先选择一个包')returnpkg_name = selected_item.text().split('==')[0]# 确认卸载confirm = QMessageBox.question(self, '确认卸载',f'确定要卸载 {pkg_name} 吗?',QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)if confirm == QMessageBox.StandardButton.Yes:self.run_pip_command('uninstall', pkg_name)def upgrade_package(self):"""升级Python包"""if not self.current_python:QMessageBox.warning(self, '警告', '请先选择一个Python版本')returnselected_item = self.package_list.currentItem()if not selected_item:QMessageBox.warning(self, '警告', '请先选择一个包')returnpkg_name = selected_item.text().split('==')[0]# 确认升级confirm = QMessageBox.question(self, '确认升级',f'确定要升级 {pkg_name} 吗?',QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)if confirm == QMessageBox.StandardButton.Yes:self.run_pip_command('install', pkg_name, upgrade=True)def run_pip_command(self, command, pkg_name, version=None, upgrade=False):"""执行pip命令的通用方法"""if not self.current_python:QMessageBox.warning(self, '警告', '请先选择一个Python版本')return# 构建命令cmd = [self.current_python['path'], '-m', 'pip', command, pkg_name]# 卸载时自动确认if command == 'uninstall':cmd.append('--yes')# 添加版本号if version:cmd[-1] = f"{pkg_name}=={version}"# 添加升级标志if upgrade:cmd.append('--upgrade')# 添加镜像源(卸载操作不需要)if self.current_mirror and command != 'uninstall':cmd.extend(['-i', self.current_mirror])host = self.current_mirror.split('//')[1].split('/')[0]cmd.extend(['--trusted-host', host])# 清空并准备显示输出self.info_text.clear()self.info_text.append(f"执行命令: {' '.join(cmd)}\n")self.info_text.append("正在处理,请稍候...\n")QApplication.processEvents() # 立即更新UItry:# 创建隐藏窗口的startupinfo对象(仅Windows系统)startupinfo = self._get_startupinfo()# 执行命令并实时输出process = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True,bufsize=1,universal_newlines=True,startupinfo=startupinfo # 添加这个参数来隐藏窗口)# 实时读取输出while True:output = process.stdout.readline()if output == '' and process.poll() is not None:breakif output:self.info_text.append(output.strip())QApplication.processEvents() # 更新UI# 获取最终返回码return_code = process.wait()# 显示结果if return_code == 0:operation_name = {'install': '安装','uninstall': '卸载',}op_name = operation_name.get(command, command)if upgrade:op_name = '升级'success_msg = f"\n{op_name}操作成功完成!"self.info_text.append(success_msg)self.status_bar.showMessage(f"{op_name} {pkg_name} 成功", 5000)self.refresh_package_list()else:error_output = process.stderr.read()self.info_text.append(f"\n错误信息:\n{error_output}")raise Exception(error_output)except Exception as e:self.status_bar.showMessage(f"操作失败", 5000)QMessageBox.critical(self, '操作失败',f'操作执行失败:\n{str(e)}')self.info_text.append(f"\n错误信息:\n{str(e)}")def show_mirror_dialog(self):"""显示镜像源设置对话框"""# 创建对话框dialog = QDialog(self)dialog.setWindowTitle('设置镜像源')layout = QVBoxLayout()# 添加说明layout.addWidget(QLabel("选择或输入要使用的PyPI镜像源:"))# 添加镜像源选项mirror_group = QButtonGroup()for i, (name, url) in enumerate(self.mirrors.items()):radio = QRadioButton(f"{name} ({url})")radio.setProperty('url', url)if url == self.current_mirror:radio.setChecked(True)mirror_group.addButton(radio, i)layout.addWidget(radio)# 自定义镜像源输入custom_radio = QRadioButton('自定义')mirror_group.addButton(custom_radio, len(self.mirrors))layout.addWidget(custom_radio)custom_edit = QLineEdit()if self.current_mirror and self.get_mirror_name(self.current_mirror) == '自定义源':custom_edit.setText(self.current_mirror)custom_radio.setChecked(True)else:custom_edit.setPlaceholderText('输入镜像源URL,例如: https://pypi.org/simple')layout.addWidget(custom_edit)# 添加单选按钮点击事件def on_radio_clicked(button):if button != custom_radio:url = button.property('url')if url:custom_edit.setText(url)# 连接信号for i in range(mirror_group.buttons().__len__()):button = mirror_group.button(i)if button:button.clicked.connect(lambda checked, btn=button: on_radio_clicked(btn))# 确定和取消按钮btn_box = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel)btn_box.accepted.connect(dialog.accept)btn_box.rejected.connect(dialog.reject)layout.addWidget(btn_box)dialog.setLayout(layout)# 处理对话框结果if dialog.exec() == QDialog.DialogCode.Accepted:selected = mirror_group.checkedButton()if selected == custom_radio and custom_edit.text():self.current_mirror = custom_edit.text()elif selected != custom_radio:self.current_mirror = selected.property('url')# 更新UI和配置self.mirror_label.setText(f'镜像源: {self.get_mirror_name(self.current_mirror)}')self.save_config()# 更新日志self.info_text.clear()self.info_text.append(f"已设置镜像源: {self.get_mirror_name(self.current_mirror)}")self.info_text.append(f"镜像源URL: {self.current_mirror}")self.status_bar.showMessage('镜像源设置成功', 3000)def closeEvent(self, event):"""重写关闭事件,保存配置"""self.save_config()event.accept()def main():"""主程序入口"""app = QApplication(sys.argv)window = PipManager()window.show()sys.exit(app.exec())if __name__ == '__main__':main()
相关文章:
Python之pip图形化(GUI界面)辅助管理工具
Python之pip图形化(GUI界面)辅助管理工具 pip 是 Python 的包管理工具,用于安装、管理、更新和卸载 Python 包(模块)。用于第三方库的安装和管理过程,是 Python 开发中不可或缺的工具。 包的安装、更新、…...
数字传播生态中开源链动模式与智能技术协同驱动的品牌认知重构研究——基于“开源链动2+1模式+AI智能名片+S2B2C商城小程序”的场景化传播实践
摘要:在数字传播碎片化与用户注意力稀缺的双重挑战下,传统品牌认知构建模式面临效率衰减与情感黏性缺失的困境。本文以“开源链动21模式AI智能名片S2B2C商城小程序”的协同创新为切入点,构建“技术赋能-场景重构-认知强化”的分析框架。通过对…...
小芯片大战略:Chiplet技术如何重构全球半导体竞争格局?
在科技飞速发展的今天,半导体行业作为信息技术的核心领域之一,其发展速度和创新水平对全球经济的发展具有举足轻重的影响。然而,随着芯片制造工艺的不断进步,传统的单片集成方式逐渐遇到了技术瓶颈,如摩尔定律逐渐逼近…...
链表的面试题3找出中间节点
来来来,接着继续我们的第三道题 。 解法 暴力求解 快慢指针 https://leetcode.cn/problems/middle-of-the-linked-list/submissions/ 这道题的话,思路是非常明确的,就是让你找出我们这个所谓的中间节点并且输出。 那这道题我们就需要注意…...
Java泛型深度解析与电商场景应用
学海无涯,志当存远。燃心砺志,奋进不辍。 愿诸君得此鸡汤,如沐春风,事业有成。 若觉此言甚善,烦请赐赞一枚,共励学途,同铸辉煌! 泛型的工作原理可能包括类型擦除、参数化类型、类型边…...
C语言 指针(7)
目录 1.函数指针变量 2.函数指针数组 3.转移表 1.函数指针变量 1.1函数指针变量的创建 什么是函数指针变量呢? 根据前面学习整型指针,数组指针的时候,我们的类比关系,我们不难得出结论: 函数指针变量应该是用来…...
go 编译报错:build constraints exclude all Go files
报错信息: package command-line-arguments imports github.com/amikos-tech/chroma-go imports github.com/amikos-tech/chroma-go/pkg/embeddings/default_ef imports github.com/amikos-tech/chroma-go/pkg/tokenizers/libtokenizers: …...
Android Service 从 1.0 到 16 的演进史
一、Android 1.0(API 1) - 服务的诞生 核心特性: 基础服务组件:作为四大组件之一,Service 用于在后台执行长时间运行的任务,不提供 UI 界面。 启动方式:通过 startService() 启动独立运行的服…...
如何保障服务器租用中的数据安全?
网络科技和互联网的飞速发展,让用户越来越依赖与网络业务,各个行业开展了不同的线上服务,租用服务器已经成为必不可少的组成部分,能够为企业带来便捷,但是数据安全也是不可忽视的,为了能够保护服务器中数据…...
python校园二手交易管理系统-闲置物品交易系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
消除AttributeError: module ‘ttsfrd‘ has no attribute ‘TtsFrontendEngine‘报错输出的记录
#工作记录 尝试消除 消除“模块ttsfrd没有属性ttsfrontendengine”的错误的记录 报错摘录: Traceback (most recent call last): File "F:\PythonProjects\CosyVoice\webui.py", line 188, in <module> cosyvoice CosyVoice(args.model_di…...
MD2card + Deepseek 王炸组合 一键制作小红书知识卡片
本文目录 MD2Card介绍使用示例deepseek 提示词输出结果MD2Card 制作小红书卡片 MD2Card介绍 MD2Card 是一个免费的 Markdown 转知识卡片工具,支持一键生成小红书风格海报、社交媒体文案排版,让创作者轻松制作精美的图文内容。支持多种主题风格、长文自动…...
Relay算子注册(在pytorch.py端调用)
1. Relay算子注册 (C层) (a) 算子属性注册 路径: src/relay/op/nn/nn.cc RELAY_REGISTER_OP("hardswish").set_num_inputs(1).add_argument("data", "Tensor", "Input tensor.").set_support_level(3).add_type_rel("Identity…...
基于RT-Thread的STM32F4开发第二讲第一篇——ADC
文章目录 前言一、RT-Thread工程创建二、ADC工程创建三、ADC功能实现1.ADC.c2.ADC.h3.mian.c 四、效果展示和工程分享总结 前言 ADC是什么不多讲了,前面裸机操作部分有很多讲述。我要说的是RT-Thread对STM32的ADC外设的适配极其不好,特别是STM32G4系类&…...
py实现win自动化自动登陆qq
系列文章目录 py实现win自动化自动登陆qq 文章目录 系列文章目录前言一、上代码?总结 前言 之前都是网页自动化感觉太容易了,就来尝尝win自动化,就先写了一个qq登陆的,这个是拿到className 然后进行点击等。 一、上代码…...
Axure : 列表分页、 列表翻页
文章目录 引言I 列表分页操作说明II 列表翻页操作说明引言 列表分页实现思路:局部变量、 中继器设置每页项目数 I 列表分页 操作说明 在列表元件底部添加一个分页下拉控件,分别为10,20,30,40,50; 将列表转换为动态面板,将设置面板大小勾选取消 给分页大小下拉控件添加…...
大学之大:隆德大学2025.5.6
隆德大学:北欧学术明珠的八百年传承与创新 一.前身历史:从中世纪神学院到现代综合大学的蜕变 隆德大学的历史可追溯至1425年,由丹麦国王埃里克七世在瑞典南部城市隆德创立的“神学与教会法研究院”。这所中世纪学府最初以培养天主教神职人员…...
每日算法-250506
每日算法学习记录 - 250506 今天记录了三道算法题的解题过程和思路,分享给大家。 3192. 使二进制数组全部等于 1 的最少操作次数 II 题目 思路 贪心 解题过程 我们从左到右遍历数组。使用一个变量 ret 来记录已经执行的操作次数。 对于当前元素 nums[i]&#x…...
【免费试用】LattePanda Mu x86 计算模块套件,专为嵌入式开发、边缘计算与 AI 模型部署设计
本次活动为载板设计挑战,旨在激发创意与技术实践能力,鼓励电子工程师、创客、学生及开发者围绕指定LattePanda Mu进行功能丰富、应用多样的载板开发设计。参赛用户将有机会展示硬件设计能力,并通过作品解决实际问题或构建创新项目。本次挑战活…...
用于备份的git版本管理指令
一、先下载一个git服务器软件并安装,创建一个git服务器进行备份的版本管理。 下列指令用于git常用备份: 1、强制覆盖远程仓库: git push --force origin master 2、重新指向新仓库: git remote set-url origin http://192.168.1.2…...
STM32H743单片机实现ADC+DMA多通道检测
在stm32cubeMX上配置ADCDMA实现多通道检测功能 DMA配置 生成代码,HAL_ADC_Start_DMA开始DMA读取ADC值,HAL_ADC_Stop_DMA关闭DMA读取 void Start_ADC2_DMA(void) {/* 初始化后校准ADC */HAL_ADCEx_Calibration_Start(&hadc2, ADC_CALIB_OFFSET, ADC_…...
(提升)媒体投稿技能
1\前期策划与准备 精准定位目标受众,分析内容偏好与活跃媒体基于目标受众,确定发稿核心主题与内容方向 2\内容创作与素材 撰写稿件注重标题吸引力,确保内容逻辑清晰价值突出。素材整合准备高质量的配图、视频 3\内部审核与优化 对稿件内…...
2025年提交App到Appstore从审核被拒到通过的经历
今年3月份提交一个App到Appstore,感觉比以前要严格了很多,被拒了多次才通过。 如果周末提交审核会非常非常,所以最好选择周一之周四的中午提交。 第一次提交被拒,原因为 Guideline 2.1 - Performance - App Completeness Guidel…...
63.微服务保姆教程 (六) SkyWalking--分布式链路追踪系统/分布式的应用性能管理工具
SkyWalking—分布式链路追踪系统/分布式的应用性能管理工具(APM) 一、为什么要用SkyWalking 对于一个有很多个微服务组成的微服务架构系统,通常会遇到一些问题,比如: 如何串联整个调用链路,快速定位问题如何缕清各个微服务之间的依赖关系如何进行各个微服务接口的性能分…...
vue3 computed方法传参数
我们对computed的基础用法不陌生,比如前端项目中经常会遇到数据处理的情况,我们就会选择computed方法来实现。但大家在碰到某些特殊场景,比如在template模板中for循环遍历时想给自己的计算属性传参,这个该怎么实现呢,很…...
Linux中为某个进程临时指定tmp目录
起因: 在linux下编译k8s,由于编译的中间文件太多而系统的/tmp分区设置太小,导致编译失败,但自己不想或不能更改/tmp分区大小,所以只能通过其他方式解决。 现象: tmp分区大小: 解决方法&#x…...
Informer源码解析4——完整注意力机制解读
完整注意力机制 源码 class FullAttention(nn.Module):def __init__(self, mask_flagTrue, factor5, scaleNone, attention_dropout0.1, output_attentionFalse):"""实现完整的注意力机制,支持因果掩码和注意力权重输出。Args:mask_flag (bool): 是…...
第一节:Web3开发概述
一、什么是Web3? 如果把互联网比作一个「大超市」: Web1(1990年代):你只能看货架上的商品(比如新浪、搜狐这种只读网站)。Web2(现在):你不仅能看࿰…...
【愚公系列】《Manus极简入门》022-艺术创作顾问:“艺术灵感使者”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
k8s node 内存碎片化如何优化?
在 Kubernetes 集群中,内存碎片化(Memory Fragmentation)会导致系统无法分配连续的内存块,即使总内存充足,也可能触发 OOM(Out of Memory)或影响性能。以下是针对 k8s Node 内存碎片化的优化策略…...
当K8S容器没有bash时7种高阶排查手段
遇到容器没有bash甚至没有sh的情况,就像被困在没有门窗的房间。但真正的K8S运维高手,即使面对这种情况也能游刃有余。以下是我们在生产环境锤炼出的7大实战技巧: 一、基础三板斧(新手必学) 1. 日志捕获术——穿透重启…...
linux -c程序开发
目的是在linux中创建可执行的c语言程序的步骤 和gcc,make和git的简单运用 建立可执行程序的步骤: -1:预处理: --:头文件展开;--去掉注释;--宏替换;--条件编译 -2:编译 --:将预处理之后的c语言替换为汇编语言带阿米 --:语法分析,语义分析,代码生成 --:检查语法正确性并且优…...
LLM损失函数面试会问到的
介绍一下KL散度 KL(Kullback-Leibler散度衡量了两个概率分布之间的差异。其公式为: D K L ( P / / Q ) − ∑ x ∈ X P ( x ) log 1 P ( x ) ∑ x ∈ X P ( x ) log 1 Q ( x ) D_{KL}(P//Q)-\sum_{x\in X}P(x)\log\frac{1}{P(x)}\sum_{x\in X}…...
【redis】redis 手动切换主从
场景一: 测试需要,需要手动切换主从 在redis节点: $ redis-cli -h xx.xx.xx.xx -p XX -a XX shutdown 不要直接关闭redis进程,使用 shutdown ,能在进程关闭前持久化内存中的数据 待主从切换完毕后࿱…...
Webug4.0靶场通关笔记17- 第21关文件上传(htaccess)
目录 第21关 文件上传(htaccess) 1.打开靶场 2.源码分析 (1)右键源码 (2)源码分析 3.渗透实战 (1)配置环境 (2)构造脚本 (3)访问脚本 本文通过《webu…...
ASP.NET Core 中间件
文章目录 前言一、中间件的本质定义:类比: 二、作用场景:三、中间件的执行顺序四、中间件的配置方式1)委托形式(最常见):2)类形式: 五、核心方法六、注意事项七、中间件 …...
Linux:进程间通信---命名管道共享内存
文章目录 1.命名管道1.1 命名管道是什么1.2 如何创建命名管道1.3 如何通过命名管道实现进程间通信 2. 共享内存2.1 共享内存的原理2.2 共享内存的系统接口与接口的调用2.3 共享内存的挂接2.4 共享内存的特性 序:在上一章对用来进行进程间通信的匿名管道进行了详细的…...
一个基于Asp.Net Core + Angular + Bootstrap开源CMS系统
从零学习构建一个完整的系统 推荐一个功能强大、易于扩展、安全可靠的开源内容管理系统,适用于各种类型和规模的网站。 项目简介 MixCoreCMS是一个基于.NET Core框架的开源内容管理系统(CMS),提供了丰富的的基础功能和插件&…...
ECMAScript 6(ES6):JavaScript 现代化的革命性升级
1. 版本背景与发布 发布时间:2015 年 6 月,由 ECMA International 正式发布,标准编号为 ECMA-262 Edition 6(后称 ES2015)。历史意义: JavaScript 诞生 20 年后的革命性升级,首次引入类&#…...
基于WebUI的深度学习模型部署与应用实践
引言 随着深度学习技术的快速发展,如何将训练好的模型快速部署并提供友好的用户交互界面成为许多AI项目落地的关键。WebUI(Web User Interface)作为一种轻量级、跨平台的解决方案,正被广泛应用于各类AI模型的部署场景。本文将详细介绍基于Python生态构建WebUI的技术方案,包…...
MySQL表的增删查改
目录 一、MySQL表的增删查改二、Create单行数据全列插入多行数据 指定列插入插入否则更新替换数据 三、RetrieveSELECT 列WHERE 条件NULL的查询结果排序筛选分页结果 四、Update将孙悟空同学的数学成绩修改为80分将曹孟德同学的数学成绩修改为60分,语文成绩修改为7…...
Android第六次面试总结之Java设计模式(二)
一、适配器模式(Adapter Pattern) 1. ListView vs RecyclerView 的 Adapter 核心区别?为什么 RecyclerView 需要 ViewHolder? 解答: 核心区别: 特性ListView.Adapter(如 ArrayAdapter…...
QuecPython+腾讯云:快速连接腾讯云l0T平台
该模块提供腾讯 IoT 平台物联网套件客户端功能,目前的产品节点类型仅支持“设备”,设备认证方式支持“一机一密”和“动态注册认证”。 BC25PA系列不支持该功能。 初始化腾讯 IoT 平台 TXyun TXyun(productID, devicename, devicePsk, ProductSecret)配置腾讯 IoT…...
说下RabbitMQ的整体架构
RabbitMQ 是一个基于 AMQP(Advanced Message Queuing Protocol) 协议的开源消息中间件,RabbitMQ的整体架构围绕消息的生产、路由、存储和消费设计,旨在实现高效、可靠的消息传递,它由多个核心组件协同工作。 核心组件 …...
Qt Creator 网络编程----Socket客户端服务端
1、在Qt项目中的.pro中添加 network模块,用于Socket网络编程使用 QT network 2、相关Tcp网络通信协议头文件 #include <QtNetwork/QTcpServer> #include <QtNetwork/QTcpSocket> #include <QtNetwork/QHostAddress> 3、Qt socket运行实…...
《深度学习实践教程》[吴微] ch-5 3/5层全连接神经网络
一、练习课本上3层全连接神经网络识别手写数字。 答案代码: import torch from torch import nn, optim from torch.autograd import Variable from torch.utils.data import DataLoader from torchvision import datasets, transforms# 定义一些超参数 batch_size…...
OrcaFex11.5
OrcaFlex 11.5是一款专业的海洋工程动态分析软件 由英国Orcina公司开发 主要用于模拟和分析海洋结构物在复杂海洋环境中的动态响应 该软件广泛应用于海上油气开发 海上风电 海洋可再生能源等领域 OrcaFlex 11.5具有强大的建模和仿真能力 支持多种海洋结构物的模拟 包括船舶 …...
MUX-vlan
MUX-VLAN 理论环节 1. 定义与核心作用 Principal VLAN(主VLAN) 是 MUX VLAN(Multiplex VLAN)架构的核心组件,充当公共资源的访问枢纽,实现以下核心功能: 资源共享:允许所有从VLAN…...
vue3中解决 return‘ inside ‘finally‘ block报错的问题
vue3中解决 return’ inside ‘finally’ block报错的问题 这个错误信息通常表明你在使用Vue 3框架时,在finally块中不正确地使用了return语句。在JavaScript中,finally块是保证执行的最后一个代码块,用于释放资源或执行清理操作,…...
TestStand API 简介
TestStand API 简介 在自动化测试领域,TestStand 凭借其灵活的架构和强大的功能,成为众多开发者的首选工具。而 TestStand API(Application Programming Interface,应用程序编程接口)则是打开 TestStand 强大功能的 “…...