告别Electron!用Python+Streamlit开发跨平台桌面应用的完整流程
告别Electron用PythonStreamlit开发跨平台桌面应用的完整流程最近几年桌面应用开发领域似乎被Electron和类似的Web技术栈“统治”了。很多开发者默认选择它因为它能让你用熟悉的HTML、CSS和JavaScript来构建跨平台应用。但用过的人都知道Electron应用那庞大的体积和惊人的内存占用常常让人头疼。一个简单的“Hello World”应用打包后动辄上百兆运行时轻松吃掉几百兆内存这真的合理吗如果你和我一样主要用Python做数据分析、机器学习或者自动化工具心里可能一直有个念头能不能就用Python不引入复杂的Node.js生态也能做出像样的桌面应用毕竟我们的核心逻辑都在Python里为了一个界面去学一整套前端技术栈有时感觉像是为了喝杯牛奶而养了头牛。好消息是现在这个想法完全可以实现。通过将Streamlit一个极简的Web应用框架和PyWebView一个轻量级的Web视图封装库结合起来我们可以用纯Python技术栈打造出体验接近原生、分发简单的桌面应用。这套方案特别适合那些逻辑复杂但界面交互相对标准的工具类应用比如数据可视化仪表盘、内部配置工具、模型演示界面等。它大幅降低了技术栈的复杂度让你能更专注于业务逻辑本身。1. 为什么是PythonStreamlit而不是Electron在深入技术细节之前我们有必要先理清为什么这个组合值得你花时间尝试。这不仅仅是技术选型更关乎开发效率和最终产品的用户体验。Electron的优势毋庸置疑生态成熟、社区庞大、界面能力强大毕竟是完整的浏览器内核。但它带来的负担也很明显巨大的资源占用每个Electron应用都打包了一个完整的Chromium浏览器内核。这意味着即使用户同时运行多个基于Electron的应用每个应用也都在独立消耗着可观的内存和CPU资源。复杂的构建与分发你需要管理package.json、处理npm依赖、配置Webpack等构建工具。对于后端或数据科学背景的开发者这又是一道学习门槛。安全更新滞后应用内嵌的Chromium版本更新依赖于应用开发者无法像独立浏览器那样及时获取安全补丁。相比之下Python Streamlit PyWebView的方案提供了一种截然不同的思路极简的技术栈你只需要懂Python。Streamlit让你用声明式的方式描述UIPyWebView负责把UI装进一个原生窗口。没有前后端分离的复杂通信没有状态管理的烦恼。轻量级与高效PyWebView使用的是操作系统自带的Web引擎Windows上是WebView2/EdgeHTMLmacOS上是WebKitLinux上是WebKitGTK。这意味着你的应用本身非常轻量启动快内存占用远低于同等功能的Electron应用。开发体验的飞跃Streamlit的核心是“数据驱动UI”。你的代码从上到下执行任何输入部件的交互都会触发脚本重新运行并自动更新界面。这种响应式编程模型对于快速原型开发和数据探索应用来说效率高得惊人。为了更直观地对比我们来看一个简单的特性对照表特性维度ElectronPython Streamlit PyWebView说明技术栈JavaScript/HTML/CSS, Node.js纯Python后者对Python开发者更友好。应用体积庞大 (≥70MB)小巧(≈10-30MB含Python运行时)后者分发更便捷。内存占用高 (每个应用独立Chromium实例)较低(共享系统Web引擎)后者在多应用运行时优势明显。UI开发范式命令式/组件化 (React/Vue等)声明式/响应式(Streamlit)Streamlit学习曲线极低适合快速开发。跨平台一致性极高 (Chromium保证)良好(依赖系统Web引擎略有差异)后者在主流平台表现一致细节可能有差异。适合场景复杂桌面应用 (如VSCode, Slack)工具类、仪表盘、数据展示、内部系统后者在交互逻辑不极度复杂的场景下是绝佳选择。提示这套方案并非要完全取代Electron。对于需要深度操作系统集成、复杂多窗口管理或极致性能的桌面应用Electron仍是更成熟的选择。但对于大量存在的、以数据处理和展示为核心的“智能工具”Python方案提供了一个优雅、高效的替代路径。2. 核心工具链搭建嵌入式Python与依赖管理要打造一个真正可分发、开箱即用的桌面应用第一步就是创建一个独立的、不依赖用户本地Python环境的运行包。这里我们选择嵌入式Python作为基础。2.1 为什么是嵌入式Python嵌入式Python是官方提供的、一个最小化的Python发行版。它不包含标准库的文档、测试文件和pip等工具体积小巧非常适合嵌入到其他应用程序中。我们的目标是将它和我们的应用代码、依赖一起打包成一个完整的文件夹用户双击即可运行无需任何安装步骤。操作步骤获取嵌入式Python从Python官网下载对应平台和版本的嵌入式包。例如对于Windows 64位系统可以下载python-3.11.x-embed-amd64.zip。建议选择与Streamlit兼容的版本如3.7-3.11。准备项目目录创建一个清晰的项目根目录例如my_desktop_app。将解压后的嵌入式Python文件夹如python-3.11.3-embed-amd64放入其中并可以重命名为更简洁的名字如python_runtime。启用pip并配置镜像嵌入式Python默认不包含pip。我们需要手动启用。下载get-pip.py脚本放入python_runtime目录。修改python_runtime目录下的python311._pth文件文件名中的版本号可能不同取消#import site的注释使其变为import site。这是为了让Python能识别第三方包安装路径。运行以下命令安装pip.\python_runtime\python.exe get-pip.py为了加速后续依赖安装可以在python_runtime目录创建pip.ini文件配置国内镜像源[global] index-url https://pypi.tuna.tsinghua.edu.cn/simple trusted-host pypi.tuna.tsinghua.edu.cn timeout 1202.2 安装核心依赖Streamlit与PyWebView在独立的Python环境中安装我们所需的库。# 进入项目根目录使用嵌入式Python的pip进行安装 .\python_runtime\python.exe -m pip install streamlit .\python_runtime\python.exe -m pip install pywebview安装完成后你的python_runtime\Scripts目录下会出现streamlit.exe等可执行文件。此时可以测试Streamlit是否能独立运行.\python_runtime\Scripts\streamlit.exe hello这个命令会启动Streamlit内置的示例应用并在默认浏览器中打开。如果能看到界面说明Streamlit环境配置成功。注意嵌入式环境可能缺少一些底层库尤其是在Linux系统上。如果运行Streamlit时出现与cryptography或watchdog相关的错误可能需要根据操作系统安装额外的开发工具链如gcc,libffi-dev等。在Windows上通常问题较少。3. 构建应用逻辑与Streamlit界面现在我们来创建真正的应用。在项目根目录下创建一个app文件夹用于存放所有应用代码。3.1 编写Streamlit应用 (app/main.py)Streamlit应用的编写直观得令人愉悦。你不需要设计HTML模板或编写CSS只需像写脚本一样描述界面。下面是一个增强版的数据看板示例它包含了更多典型的UI组件# app/main.py import streamlit as st import pandas as pd import numpy as np import plotly.express as px from datetime import datetime # 设置页面配置这必须在其他Streamlit命令之前 st.set_page_config( page_title销售数据看板, page_icon, layoutwide ) # 应用标题 st.title( 交互式销售数据分析看板) st.markdown(这是一个使用纯Python构建的桌面应用示例。) # 在侧边栏添加控制部件 with st.sidebar: st.header(控制面板) date_range st.date_input( 选择日期范围, value(datetime(2023, 1, 1), datetime(2023, 12, 31)) ) category_filter st.multiselect( 筛选产品类别, options[电子产品, 服装, 食品, 家居, 图书], default[电子产品, 服装] ) update_btn st.button(更新图表, typeprimary) # 生成模拟数据 st.cache_data def load_data(): np.random.seed(42) dates pd.date_range(start2023-01-01, end2023-12-31, freqD) data pd.DataFrame({ date: np.random.choice(dates, size500), category: np.random.choice([电子产品, 服装, 食品, 家居, 图书], size500), sales: np.random.randint(100, 5000, size500), profit: np.random.uniform(0.1, 0.4, size500) * np.random.randint(100, 5000, size500) }) data[profit_margin] data[profit] / data[sales] return data df load_data() # 根据侧边栏筛选数据 if len(date_range) 2: mask (df[date] pd.Timestamp(date_range[0])) (df[date] pd.Timestamp(date_range[1])) df_filtered df[mask].copy() else: df_filtered df.copy() if category_filter: df_filtered df_filtered[df_filtered[category].isin(category_filter)] # 主显示区域 col1, col2 st.columns(2) with col1: st.subheader(销售额趋势) # 使用Plotly创建交互式图表 fig1 px.line(df_filtered.groupby(date)[sales].sum().reset_index(), xdate, ysales, title每日销售额汇总) st.plotly_chart(fig1, use_container_widthTrue) with col2: st.subheader(品类利润分布) fig2 px.box(df_filtered, xcategory, yprofit_margin, title各品类利润率分布箱形图) st.plotly_chart(fig2, use_container_widthTrue) # 另一行 st.subheader(详细数据表) # 添加一个交互式数据表 edited_df st.data_editor(df_filtered.head(20), num_rowsdynamic) # 底部信息 st.divider() st.caption(f数据最后更新于{datetime.now().strftime(%Y-%m-%d %H:%M:%S)} | 总记录数{len(df_filtered)})这个应用展示了Streamlit的核心能力用简单的Python脚本创建出包含交互控件、多种图表和数据表格的复杂界面。st.cache_data装饰器能缓存函数结果避免每次交互都重新计算数据提升了响应速度。3.2 理解Streamlit的运行模型与传统的Web开发不同Streamlit应用是无状态的。每次用户与部件如按钮、滑块交互整个脚本都会从头到尾重新执行。Streamlit运行时负责比较前后两次执行产生的UI元素并只更新浏览器中发生变化的部分。这种模型使得代码非常容易理解和调试因为你不需要管理复杂的客户端状态。4. 使用PyWebView封装为原生窗口让Streamlit应用在浏览器中运行只是第一步。我们的目标是一个独立的桌面窗口。这就是PyWebView的用武之地。它的作用是在一个原生桌面窗口内加载并显示我们的Streamlit本地服务器。4.1 创建窗口封装器 (app/launcher.py)我们需要编写一个启动脚本它主要完成三件事在一个随机可用端口上启动Streamlit服务器--server.headlesstrue确保不自动打开浏览器。启动一个PyWebView窗口并将其指向本地Streamlit服务器的地址。管理进程生命周期当用户关闭窗口时优雅地关闭Streamlit服务器。# app/launcher.py import webview import threading import subprocess import time import socket import sys import os from pathlib import Path def find_free_port(start_port8501, end_port8600): 在指定范围内找到一个空闲的TCP端口。 for port in range(start_port, end_port 1): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: try: s.bind((localhost, port)) return port except OSError: continue raise Exception(fNo free port found between {start_port} and {end_port}) def run_streamlit(port, python_runtime_path, app_dir): 在一个子进程中启动Streamlit服务器。 # 构建Streamlit命令 streamlit_exe Path(python_runtime_path) / Scripts / streamlit.exe app_file Path(app_dir) / main.py cmd [ str(streamlit_exe), run, str(app_file), --server.port, str(port), --server.headless, true, --browser.serverAddress, localhost, --server.fileWatcherType, none, # 禁用文件监听提升性能 --theme.base, light ] # 使用subprocess.Popen启动并重定向输出到日志文件或丢弃 process subprocess.Popen( cmd, stdoutsubprocess.PIPE, stderrsubprocess.PIPE, textTrue, creationflagssubprocess.CREATE_NO_WINDOW if sys.platform win32 else 0 # Windows下隐藏控制台 ) print(f[INFO] Streamlit server started on port {port} (PID: {process.pid})) # 简单读取输出避免缓冲区阻塞生产环境应更完善地处理日志 def log_output(pipe, label): for line in iter(pipe.readline, ): print(f[Streamlit {label}] {line}, end) threading.Thread(targetlog_output, args(process.stdout, STDOUT), daemonTrue).start() threading.Thread(targetlog_output, args(process.stderr, STDERR), daemonTrue).start() return process def main(): # 路径配置假设启动脚本在app/launcher.py项目根目录是其祖父目录 current_dir Path(__file__).parent project_root current_dir.parent python_runtime_path project_root / python_runtime app_dir current_dir # app目录 # 1. 找到空闲端口 port find_free_port() print(f[INFO] Using port: {port}) # 2. 启动Streamlit服务器 streamlit_process run_streamlit(port, python_runtime_path, app_dir) # 等待服务器初步启动 time.sleep(2) # 3. 创建并启动PyWebView窗口 url fhttp://localhost:{port} window_title 我的Python桌面应用 # 定义窗口关闭时的回调函数 def on_closed(): print([INFO] Window closed. Terminating Streamlit server...) streamlit_process.terminate() streamlit_process.wait(timeout5) print([INFO] Cleanup complete.) window webview.create_window( titlewindow_title, urlurl, width1200, height800, min_size(800, 600), # text_selectTrue, # 允许用户选择文本 # confirm_closeTrue # 关闭前确认可选 ) window.events.closed on_closed print(f[INFO] Launching PyWebView window for {url}) webview.start(debugFalse, guiNone) # guiNone 自动选择最佳后端 if __name__ __main__: main()这个脚本是应用启动的核心。它巧妙地使用subprocess模块在后台运行Streamlit然后通过PyWebView创建一个指向localhost:port的窗口。on_closed回调确保了应用关闭时后台进程也被清理不会留下“僵尸”服务。4.2 处理跨平台差异PyWebView的一个优点是它抽象了不同操作系统的Web视图后端Windows: 优先使用WebView2 (基于Edge Chromium)如果未安装则会回退到旧版的EdgeHTML或IE模式。建议引导用户安装WebView2运行时以获得最佳体验。macOS: 使用原生WebKit框架。Linux: 使用WebKitGTK。为了确保应用在所有平台表现一致可以在UI设计时采用相对保守的CSS特性并进行充分测试。PyWebView的API是统一的这屏蔽了底层的平台差异。5. 打包与分发打造真正的“开箱即用”开发完成后我们需要将整个项目——嵌入式Python、安装的包、应用代码和启动脚本——组织成一个用户可以简单运行的形式。5.1 组织最终分发结构一个清晰的分发文件夹结构如下my_desktop_app/最终分发给用户的文件夹 ├── python_runtime/嵌入式Python环境 │ ├── python.exe │ ├── python311._pth │ ├── Scripts/ │ │ ├── streamlit.exe │ │ └── ... │ └── Lib/site-packages/所有pip安装的包 ├── app/你的应用代码 │ ├── main.pyStreamlit主应用 │ ├── launcher.pyPyWebView启动器 │ └── assets/可选存放图片等静态资源 ├── run.batWindows启动脚本 ├── run.shLinux/macOS启动脚本 └── icon.ico应用图标用于Windows5.2 创建启动脚本为了让用户双击即可运行我们需要为不同平台创建启动脚本。对于Windows (run.bat):echo off REM 获取批处理文件所在目录 cd /d %~dp0 REM 启动应用并隐藏控制台窗口如果希望隐藏可以使用VBS或编译为EXE start MyApp /B .\python_runtime\python.exe .\app\launcher.py pause/B参数让start命令不在新窗口中运行但控制台窗口本身可能仍会闪现。为了完全隐藏控制台可以将其包装在一个VBS脚本中或者使用下一节的方法。对于Linux/macOS (run.sh):#!/bin/bash # 获取脚本所在目录 DIR$( cd $( dirname ${BASH_SOURCE[0]} ) pwd ) cd $DIR # 执行启动器 $DIR/python_runtime/bin/python3 $DIR/app/launcher.py记得给run.sh添加执行权限chmod x run.sh。5.3 进阶使用PyInstaller生成单一可执行文件虽然文件夹形式的分发已经可用但生成一个单一的.exe或.app文件显得更专业。PyInstaller是完成这项工作的绝佳工具。它可以将Python程序及其所有依赖打包成一个独立的可执行文件。安装PyInstaller在开发环境非嵌入式环境中安装。pip install pyinstaller编写Spec文件或直接使用命令我们需要打包的是launcher.py但它依赖了整个app目录和python_runtime。由于我们使用了嵌入式Python和手动管理的包PyInstaller的自动分析可能不完美。更可靠的方法是将整个项目文件夹作为数据文件打包并在运行时解压到临时目录。这里提供一个更直接的思路不打包Python运行时而是将应用打包成一个引导器它仍然依赖外部的python_runtime文件夹。这样更简单体积也更可控。# 在项目根目录执行 pyinstaller --onefile --windowed --name MyDesktopApp --iconicon.ico --add-data app;app app/launcher.py--onefile: 生成单个exe文件。--windowed: 不显示控制台窗口Windows/macOS。--add-data app;app: 将app文件夹的内容添加到打包文件中在运行时解压到临时目录的app子文件夹下。但请注意这个命令打包的launcher.py会使用它自己封装的Python环境而不是我们精心准备的python_runtime。为了让打包后的exe使用我们的嵌入式环境我们需要修改launcher.py使其能判断自己是处于打包状态还是开发状态并动态定位python_runtime和app的路径。这涉及到sys._MEIPASSPyInstaller临时解压目录的使用稍微复杂一些。对于追求极致简便的初次分发直接提供整理好的文件夹和启动脚本是更推荐的方式。它避免了PyInstaller复杂的配置和潜在的路径问题调试起来也更容易。5.4 分发与更新策略将整个my_desktop_app文件夹压缩成ZIP文件就可以分发给用户了。用户解压后直接运行run.bat或run.sh即可。关于更新全量更新最简单的方式是发布新版本的ZIP包用户替换整个文件夹。由于应用是自包含的这通常很安全。增量更新进阶可以编写一个简单的更新检查脚本从网络服务器下载发生变化的文件如新的app目录内容进行替换。需要小心处理site-packages中依赖的更新。6. 性能优化与实战技巧将Web技术用于桌面应用性能是需要持续关注的点。以下是一些提升用户体验的实战技巧1. 优化Streamlit应用性能善用缓存st.cache_data和st.cache_resource是提升响应速度的神器。将耗时的数据加载、计算密集型函数或模型加载过程缓存起来。st.cache_data(ttl3600) # 缓存1小时 def load_large_dataset(filepath): return pd.read_parquet(filepath) st.cache_resource def load_ml_model(): return pickle.load(open(model.pkl, rb))避免不必要的重绘将静态内容如标题、说明文字放在st.write之外或者使用st.empty()占位符进行动态更新而不是每次重跑脚本都重新生成整个DOM。使用st.session_state管理状态对于需要在多次脚本运行间保持的数据如分页索引、表单的中间状态使用st.session_state来存储避免使用外部全局变量。2. 优化PyWebView启动与运行端口冲突处理我们的launcher.py已经实现了自动寻找空闲端口这比硬编码端口更健壮。设置合适的窗口属性根据应用需求调整webview.create_window的参数如width,height,min_size,resizable等提供更好的窗口体验。处理WebView2运行时在Windows上如果目标机器没有安装WebView2PyWebView会回退到旧版引擎。可以在应用启动时检查并提示用户下载安装以获得更好的性能和兼容性。微软提供了WebView2的常青版离线安装包。3. 调试与问题排查开发时启用调试在webview.start()中设置debugTrue可以打开浏览器开发者工具方便调试JavaScript和CSS。查看日志确保launcher.py中的Streamlit进程输出被捕获和记录到文件便于排查服务器端错误。处理进程异常退出增强launcher.py的健壮性添加信号处理如SIGINT, SIGTERM确保在强制退出时也能清理子进程。这套技术栈让我在开发内部工具时效率提升了数倍。曾经需要一个前端和一个后端协作一周的项目现在一个人用两三天就能完成从原型到可分发版本的全过程。最大的感受是心智负担大大减轻了——我不再需要在前端状态管理、构建配置和API联调上花费大量时间而是可以持续聚焦在核心的数据处理和业务逻辑上。当然它不适合所有场景但对于那些“重逻辑、轻交互”的工具类应用来说这无疑是一条更优雅、更高效的路径。

相关新闻

从SENet到ViT:一文搞懂CV中的注意力机制发展史(附代码实现)

从SENet到ViT:一文搞懂CV中的注意力机制发展史(附代码实现)

从SENet到ViT:计算机视觉注意力机制的演进与实战 如果你在过去几年里关注过计算机视觉领域的技术动态,大概率会注意到一个有趣的现象:那些在ImageNet竞赛中拔得头筹的模型,其核心创新往往与“注意力”二字紧密相连。从2017年SENet…

2026/7/4 16:46:55 阅读更多 →
避坑指南:txt转csv时99%人会遇到的编码和分隔符问题(附解决方案)

避坑指南:txt转csv时99%人会遇到的编码和分隔符问题(附解决方案)

从乱码到清晰:彻底攻克文本数据转换中的编码与分隔符陷阱 如果你曾经满怀信心地运行一段数据转换脚本,结果却收获了一屏幕的乱码,或者发现原本整齐的表格数据在CSV里挤成了一团,那么你绝不是一个人。数据格式转换,尤其…

2026/7/3 14:54:03 阅读更多 →
FreeRTOS串口框架设计避坑指南:从结构体封装到回调函数优化

FreeRTOS串口框架设计避坑指南:从结构体封装到回调函数优化

FreeRTOS串口通信框架深度优化:从结构体封装到回调函数的高性能实践 在嵌入式开发领域,串口通信是连接设备与外界最经典、最直接的桥梁。然而,当项目从简单的裸机轮询升级到基于FreeRTOS这样的实时操作系统时,串口通信的设计复杂度…

2026/7/3 8:43:49 阅读更多 →

最新新闻

使用glibc-all-in-one的10个实用技巧:从基础下载到高级调试

使用glibc-all-in-one的10个实用技巧:从基础下载到高级调试

使用glibc-all-in-one的10个实用技巧:从基础下载到高级调试 【免费下载链接】glibc-all-in-one 🎁A convenient glibc binary and debug file downloader and source code auto builder 项目地址: https://gitcode.com/gh_mirrors/gl/glibc-all-in-one…

2026/7/5 16:35:01 阅读更多 →
Stocksera数据源揭秘:从Yahoo Finance到SEC.gov的完整集成方案

Stocksera数据源揭秘:从Yahoo Finance到SEC.gov的完整集成方案

Stocksera数据源揭秘:从Yahoo Finance到SEC.gov的完整集成方案 【免费下载链接】Stocksera Finance application that provides more than 60 different alternative data to retail investors 项目地址: https://gitcode.com/gh_mirrors/st/Stocksera Stock…

2026/7/5 16:35:01 阅读更多 →
WeKnora智能知识平台:如何在3小时内构建企业级RAG与自主推理系统

WeKnora智能知识平台:如何在3小时内构建企业级RAG与自主推理系统

WeKnora智能知识平台:如何在3小时内构建企业级RAG与自主推理系统 【免费下载链接】WeKnora Open-source LLM knowledge platform: turn raw documents into a queryable RAG, an autonomous reasoning agent, and a self-maintaining Wiki. 项目地址: https://git…

2026/7/5 16:33:00 阅读更多 →
{{date}} 日志

{{date}} 日志

{{date}} 日志 【免费下载链接】OB_Template OB_Templates is a Obsidian reference for note templates focused on new users of the application using only core plugins. 项目地址: https://gitcode.com/gh_mirrors/ob/OB_Template 天气:☀️ 今日计划&…

2026/7/5 16:33:00 阅读更多 →
终极指南:如何用AI驱动的供应链瓶颈研究方法提升投资决策效率

终极指南:如何用AI驱动的供应链瓶颈研究方法提升投资决策效率

终极指南:如何用AI驱动的供应链瓶颈研究方法提升投资决策效率 【免费下载链接】serenity-skill Serenity-inspired Agent Skill for supply-chain bottleneck stock research 项目地址: https://gitcode.com/gh_mirrors/se/serenity-skill 在信息爆炸的投资时…

2026/7/5 16:24:58 阅读更多 →
Mac用户制作Windows启动盘的终极解决方案:WinDiskWriter完全指南

Mac用户制作Windows启动盘的终极解决方案:WinDiskWriter完全指南

Mac用户制作Windows启动盘的终极解决方案:WinDiskWriter完全指南 【免费下载链接】windiskwriter 🖥 Windows Bootable USB creator for macOS. 🛠 Patches Windows 11 to bypass TPM and Secure Boot requirements. 👾 UEFI &…

2026/7/5 16:22:58 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻