Pytest 测试框架实战:从 fixture 到参数化,打造优雅自动化测试工程
你有没有经历过这种时刻写了好久业务代码终于调通了心里美滋滋但转头一想到改完这模块可能把以前的功能搞坏就又有点心虚。想写点测试吧一看现有代码里那堆几十行重复的 setUp、tearDown瞬间又没了热情。我之前很长一段时间就是这个状态一直到某天在代码评审里被人狠狠安利了 Pytest用了一个星期之后我承认我之前对“优雅”这两个字的理解确实太浅了。这篇不是 Pytest 官方文档的中文翻译是我自己从入门到在真实项目里落地这套框架的完整经验总结。会讲清楚它为什么比传统写法更优雅怎么用 fixture、参数化、断言怎么从零搭一个能让 CI 跑得稳、同事看着也舒服的测试工程顺便把我踩过的坑、排查过的问题也一起列出来。不管你是刚接触自动化测试的新手还是被 unittest 折磨到想重构测试代码的老兵应该都能从这里找到点有用的东西。1. 为什么选 Pytest测试框架选型背后的逻辑1.1 从 unittest 切换到 Pytest差异究竟在哪我最早接触的测试方案是 Python 标准库自带的 unittest。它的设计思路没问题用例类、setUp、tearDown、断言方法这套体系在 Java 风格的测试框架里很成熟。但写多了以后最直观的感受就是啰嗦。每个测试类都要继承 TestCase每个断言都要写成assertEqual(a, b)、assertTrue(x)、assertIsNone(y)这种固定方法名测试代码越膨胀样板代码占比越高真正想验证的业务逻辑反而被淹没了。后来切到 Pytest第一感觉是舒服第二感觉是自由。测试函数就是普通函数断言就是原生assert初始化逻辑不再绑在类模板里而是靠 fixture 这种函数级的依赖注入来管理。这意味着同一个测试工程里我可以按场景自由组合不同粒度的前置条件和清理逻辑而不是在一个固定的类模板里硬塞所有东西。两个框架的差异我用一个常用场景对比过场景unittest 写法Pytest 写法断言两个值相等self.assertEqual(a, b)assert a b断言抛出异常需要 with self.assertRaises(...)with pytest.raises(...)初始化/清理setUp/tearDown 类内方法fixture 函数支持 yield 分隔前置和后置参数化执行多组数据手动循环或构造子类pytest.mark.parametrize 装饰器跳过用例self.skipTest(原因)pytest.mark.skip(reason原因)失败信息只有 AssertionError 和传入的 msg自动对比左右值显示具体差异这个表格不是要说服所有人放弃旧框架而是想说明一个观点Pytest 的设计哲学是“约定优于配置”它把测试从 OOP 的模板束缚里解放出来让你写的是“我要验证什么”而不是“我该继承谁、重写谁”。这种心智负担的下降在维护长期项目的过程中会越来越明显。1.2 Pytest 真正解决的四个实际问题我复盘过自己为什么留下来用 Pytest总结了四个实际问题都是真实开发中会遇到的。第一测试代码的可读性。unittest 那一套断言方法写多了代码读起来像在调用某个 API而不是在表达业务逻辑。assert 用户余额 100这种自然语言式的断言任何同事扫一眼就明白意图。而且 Pytest 的失败信息是增强过的断言1 2失败时它会直接在报告里显示assert 1 2还会附上左右值来自哪个表达式节点定位问题比盯着一个光秃秃的 AssertionError 快得多。第二初始化逻辑不再重复。传统写法里每个测试类通常都有相同的 setUp 开头几行创建对象、连接数据库、清理临时文件。Pytest 的 fixture 把这些抽成可复用的函数谁需要谁声明参数。依赖关系显式地写在函数签名里IDE 也能识别哪怕这个测试涉及十几个前置条件阅读起来依然一目了然。第三用例数量膨胀的问题。边界值测试、状态机测试、接口入参校验这些场景往往需要同一逻辑覆盖多组数据。用 parametrize 之后一个测试函数就能声明几十个参数组合运行时会自动展开成多个独立用例节点哪个组合挂了直接看名称就知道是哪组数据。这比复制粘贴测试函数、改改参数要干净得多。第四CI 集成与团队协作的友好度。Pytest 有丰富的命令行选项、插件生态、JUnit XML 报告格式主流 CI 系统都原生支持。它对失败用例的摘要、对慢用例的统计、对警告的过滤都是可配置的。这些能力让一个测试框架在本地开发和流水线里都能发挥同样的作用而不会出现“本地跑得好好的上了 CI 全红”的尴尬。2. 核心概念拆解断言、fixture 与参数化2.1 断言机制为什么原生 assert 比 assertEqual 好用Pytest 最让人上头的设计就是直接使用 Python 原生assert。很多人第一次接触会疑惑这跟 unittest 里的assertTrue有啥区别区别在于 Pytest 在运行时会启动一个断言重写机制把失败的断言信息增强成“能看到具体左右值”的报告而不只是一个简单的异常对象。举个例子你写def test_balance(): balance 99 assert balance 100运行的时候 Pytest 会显示assert 99 100它直接把左边实际值 99 写出来了而且如果这个值来自某个函数调用报告里还会给出调用上下文。这个体验比AssertionError: 余额不正确这种要靠自己拼 msg 的方式要直观得多。所以我现在写断言的原则很简单能用原生 assert 表达的绝不用额外封装。异常断言的场景也经常遇到比如测试一个下单接口预期传入非法参数时抛出InvalidOrderError。写成with pytest.raises(InvalidOrderError, match金额必须为正数): order.submit(total_amount-10)match 参数支持正则匹配异常消息这比只判断异常类型更严谨一步能确保业务错误码或提示内容也符合预期。浮点数比较是个历史遗留问题。0.1 0.2 0.3在 Python 里天然为 False直接断言肯定踩坑。Pytest 提供pytest.approx用法和普通断言一样自然assert (0.1 0.2) pytest.approx(0.3, abs1e-6)集合、字典、列表的断言也有高级玩法assert admin in user_permissions、assert user_dict expected_dictPytest 对字典对比失败时还会做字段级 diff 展示这种特性在接口返回体校验里非常实用。2.2 fixture初始化与清理的正确打开方式我第一次接触 fixture 时觉得这词很唬人其实它就是“带状态的准备与清理函数”。普通测试函数只管测试逻辑外部资源比如数据库连接、HTTP 客户端、临时目录都由 fixture 提供。fixture 函数里yield之前是“准备阶段”yield之后是“清理阶段”整个生命周期在同一个函数里写清楚清晰程度远超 setUp 和 tearDown 分两处维护的旧方案。fixture 的粒度由 scope 参数控制默认是 function也就是每个测试用例都执行一次。其他内置级别有 class、module、package、session对应每个测试类、每个模块、每个包、整个测试运行周期执行一次。选择合适的 scope 是设计测试架构的关键用错了要么资源浪费要么数据串扰。我用个生活化的类比fixture 像后厨备菜。function 级别是“每桌现炒”class 级别是“每桌宴席统一备料”module 级别是“整层餐厅共享同一批食材”session 级别是“今天开张前一次性采购完毕”。备菜太多吃不完会馊备菜太少每桌都要重新洗菜切菜也费劲。测试里的资源同理该共享的共享该隔离的隔离。举一个实际的数据库测试例子pytest.fixture(scopesession) def db_conn(): conn create_db_connection() yield conn conn.close() pytest.fixture() def fresh_order(db_conn): order create_order(db_conn) yield order delete_order(db_conn, order.id)这里db_conn是整个测试会话共用一个连接fresh_order则是每个用例独立的订单数据用完就删。依赖关系通过函数参数体现fresh_order声明它需要db_connPytest 会自动满足这个依赖。跟传统继承式 setUp 相比这种组合方式更灵活不同测试函数可以自由组合不同 fixture而不必被迫执行整个测试类的公共 setUp。写 fixture 有两条实操建议。第一清理逻辑必须健壮哪怕测试中断也要尽量执行yield之后的代码要认真写不要偷懒省掉资源关闭。第二scope 越大越要保持 fixture 内部“无状态”。session 级 fixture 里如果保存了一个可变字典用例 A 往里塞了数据用例 B 再去读就会受影响这种隐式耦合排查起来特别头疼。2.3 参数化用 parametrize 告别复制粘贴接口测试或者业务逻辑测试里最常遇到的场景是一套代码逻辑要覆盖 N 组输入输出。不用参数化的时候只能一个函数复制 N 遍改一处逻辑要同步改 N 个测试函数漏改一个就是测试失真。pytest.mark.parametrize装饰器从根源上解决了这个问题。它的用法很直觉第一个参数是参数字符串多个参数用逗号分隔第二个参数是测试数据列表每个元素是一组参数。运行时每组数据都会被当成一个独立用例执行独立报告结果。我经常拿订单状态机做举例。假设一个订单有 pending、paid、shipped、completed 几个状态合法转换和非法转换分别要测用参数化写出来是这样pytest.mark.parametrize(from_state,to_state,allowed, [ (pending, paid, True), (pending, cancelled, True), (paid, shipped, True), (shipped, completed, True), (paid, pending, False), (completed, shipped, False), ]) def test_order_transition(from_state, to_state, allowed): order Order(from_state) if allowed: order.transition(to_state) assert order.state to_state else: with pytest.raises(InvalidTransition): order.transition(to_state)运行的时候你会发现测试节点名称自动包含了参数组合类似test_order_transition[pending-paid-True]这种格式。哪一组挂了直接能看出来不用去日志里猜是哪个分支出了问题。数据集很大的时候还可以加ids参数给每个用例指定更可读的名字比如pending-to-paid报告会显得非常专业。参数化也可以和 fixture 配合使用搭配得当时能构造出更强的数据组合场景但注意别盲目追求笛卡尔积。我见过有同事把 5 个参数全写成 parametrize结果一次测试跑出几千个用例整体耗时就失控了。参数化的目的是清晰覆盖边界不是数量竞赛。3. 实操落地从零搭建一个可复用的 Pytest 测试工程3.1 环境准备与工程目录设计先解决安装问题。Pytest 本体加常用插件一个命令就够pip install pytest pytest-cov pytest-html pytest-xdist pytest-rerunfailures这些插件的用途分别是覆盖率统计、HTML 报告、并行执行、失败用例重试。刚开始可以只装 pytest 本体等走到 CI 阶段再按需添加。工程目录我推荐下面这种布局职责划分很清楚order-service/ ├── pytest.ini ├── src/ │ ├── __init__.py │ ├── order.py │ └── warehouse.py └── tests/ ├── conftest.py ├── test_order_lifecycle.py └── test_warehouse.py业务代码放 src测试代码放 tests两者隔离。测试配套的公共 fixture 放 tests/conftest.py这个文件名在 Pytest 里有特殊含义Pytest 会自动加载 conftest.py 里的 fixture、钩子函数、插件配置不需要显式 import。测试文件用 test_ 前缀命名测试函数用 test_ 前缀这是 Pytest 的约定收集规则按规则来就不会出现“写了测试但没跑起来”的尴尬。为了让测试代码顺利导入 src 里的模块我习惯在 pytest.ini 里加一行配置。Pytest 是个高版本的框架可以直接用内置的 pythonpath 选项[pytest] testpaths tests pythonpath .这样在测试代码里from src.order import Order就能正常工作不需要为了导入而把业务代码路径硬塞进 sys.path。3.2 从零实现一个订单状态机的测试用例先给 src/order.py 写一个最简单的订单状态机实现方便后续测试演示class InvalidTransition(Exception): pass class Order: VALID_TRANSITIONS { pending: {paid, cancelled}, paid: {shipped, refunded}, shipped: {completed, returned}, } def __init__(self, statepending): self.state state self.events [] def transition(self, new_state): if new_state not in self.VALID_TRANSITIONS[self.state]: raise InvalidTransition( f非法状态转换: {self.state} - {new_state} ) self.events.append((self.state, new_state)) self.state new_state接下来在 tests/test_order_lifecycle.py 里编写测试。核心要覆盖三类行为合法转换成功、非法转换抛异常、事件记录完整。import pytest from src.order import InvalidTransition, Order pytest.fixture() def new_order(): return Order(statepending) pytest.mark.parametrize(from_state,to_state, [ (pending, paid), (paid, shipped), (shipped, completed), (shipped, returned), ]) def test_legal_transitions(new_order, from_state, to_state): new_order.state from_state new_order.transition(to_state) assert new_order.state to_state pytest.mark.parametrize(from_state,to_state, [ (paid, pending), (completed, shipped), (pending, completed), ]) def test_illegal_transitions_raise_error(new_order, from_state, to_state): new_order.state from_state with pytest.raises(InvalidTransition, match非法状态转换): new_order.transition(to_state) assert new_order.state from_state def test_transition_records_event(new_order): new_order.transition(paid) new_order.transition(shipped) assert new_order.events [(pending, paid), (paid, shipped)]运行命令python -m pytest tests/test_order_lifecycle.py -v你会看到每个参数化组合都被展开成独立的测试节点空一格就是一个用例的完整生命周期。这里的new_orderfixture 是 function 级别的每个用例都会重建一个全新订单对象天然隔离完全不需要考虑上一个用例对状态的污染。这个设计在测试数据库事务时尤其关键每个用例开启事务结束回滚互不影响。3.3 配置文件与执行策略pytest.ini 是整个工程的测试“总控台”。我分享一个自己常用的配置版本注释里写清楚每一项的意图[pytest] testpaths tests python_files test_*.py python_classes Test* python_functions test_* addopts -ra --tbshort -q markers slow: 耗时较长的用例 smoke: 冒烟用例用于快速回归 e2e: 依赖外部服务的端到端用例 filterwarnings ignore::DeprecationWarningtestpaths限定 Pytest 只扫描 tests 目录省去无关路径的搜索时间。addopts是默认命令行参数-ra显示所有用例的摘要--tbshort把失败堆栈压缩到关键行CI 日志里不会刷出一大屏无用信息。markers是自定义标记的注册表。给用例打pytest.mark.slow、pytest.mark.smoke、pytest.mark.e2e之后就能通过-m参数灵活挑选执行集合。filterwarnings用来过滤第三方库的 DeprecationWarning避免报告被噪音淹没但要谨慎使用别把自己代码里的警告也一起静音了。实际执行时的几个常用姿势也要掌握。按名字筛选用例pytest -k transition or event属于子串匹配适合快速跑相关用例。按标记筛选pytest -m smoke适合提交前快速回归。只看上次失败的用例pytest --lf这是我最常用的一个改完代码先确认上个失败点真的修好了。查最慢的用例pytest --durations5性能优化的突破口全靠它。覆盖率方面pytest --covsrc --cov-reportterm-missing可以直接输出哪些行没有被测试覆盖。配合 HTML 报告插件pytest --htmlreport.html能生成一份适合发给团队看的可视化结果。多核并行用pytest -n 4前提是测试之间相互隔离否则并行反而会暴露出一堆隐式共享状态的问题从某种意义上说这也是件好事。4. 真实项目中的常见问题与排查技巧4.1 测试收集与目录结构踩坑新手最容易遇到的情况是写好了测试文件运行pytest结果提示no tests ran。排查步骤很简单先执行pytest --collect-only -q它会列出 Pytest 实际收集到的所有测试节点。如果列表是空的说明命名不满足收集规则检查文件名是不是test_*.py、测试函数是不是test_开头、测试类是不是Test*开头。如果列表里能显示测试名但一执行就报 ModuleNotFoundError多半是导入路径问题。Pytest 的导入模式有两种prepend 和 importlib。项目结构简单时推荐让测试目录保持普通目录身份不要加__init__.py配合 pytest.ini 里的pythonpath .让测试代码能直接从项目根路径导入 src 包。这套方案我用了很久没有遇到传统__init__.py方式下的双重导入和命名冲突问题。还有一个小细节conftest.py 的层级关系。每个目录下的 conftest.py 只对当前目录及子目录生效如果你希望某几个 fixture 只被某个子模块的测试使用就把它们放在该子目录的 conftest.py 里而不是一股脑全塞到根目录的 conftest.py。这个设计是隐式作用域一开始不习惯但用好了测试项目的依赖边界会非常清晰。4.2 fixture 作用域与测试数据泄漏这是我在真实项目里踩过最深的一个坑。当时有一个 session 级别的 fixture 负责初始化数据库连接同时还往里塞了一个“当前用户”的字典用来模拟登录态。测试单独跑没问题整套跑就随机挂。原因是 session 级别 fixture 在整个测试会话里只创建一次用例 A 改了用户字典用例 B 再读就是这个被污染的状态。解决这类问题的思路分三步。第一默认优先使用 function 级 fixture除非你明确知道资源创建成本极高。第二session 级的资源里不要保存业务状态只保存无状态连接、客户端实例这类低风险对象。第三实在需要在多个用例间共享数据提供显式的 reset 方法或者在 fixture 内部按用例复制数据副本。为了排查这类问题我习惯用pytest -vv配合--setup-show参数运行。它会打印每个用例实际用了哪些 fixture、fixture 的创建顺序和执行耗时一旦某个 fixture 在多个用例间出现了“只创建一次”的痕迹就能快速定位到 scope 设过大的现场。4.3 端到端与网络场景的稳定性优化测试里调了外部接口网络一抖就红一片这是团队协作中最招人烦的问题。我的处理方案分三层。第一层给网络请求设置超时。requests 调用必须传 timeout 参数从根上避免用例卡死。第二层对自己服务的幂等接口允许失败重试。装pytest-rerunfailures插件后可以这样标记pytest.mark.flaky(reruns2, reruns_delay1) pytest.mark.e2e def test_payment_callback(): ...但重试不能滥用。重试只适合掩盖偶发的网络抖动如果断言逻辑本身有错重试一万次也一样失败。第三层在 pytest.ini 里把依赖外部服务的用例统一标记为e2e默认执行跳过。本地开发和快速 CI 通道只跑不依赖真实环境的用例专门的集成测试任务再显式加-m e2e来启动两条线互不污染。最后分享一个排查接口类问题的利器在 conftest.py 里写一个钩子函数把失败用例的请求和响应自动打印到报告里。我有一次排查支付回调测试全靠这个钩子把失败时的请求体完整打了出来定位到了是签名参数的顺序问题。钩子写法如下pytest.hookimpl(tryfirstTrue) def pytest_runtest_makereport(item, call): if call.when call and call.excinfo is not None: client item.funcargs.get(api_client) if client and hasattr(client, last_request): print(f失败请求: {client.last_request}) print(f失败响应: {client.last_response})这里的api_client是我自己定义的一个 fixture封装了 HTTP 调用逻辑内部记录了最近一次的请求和响应对象。任何用了这个 fixture 的用例失败时钩子都会自动补充现场信息排查效率比翻日志不知道高了多少倍。说实话用了这么久 Pytest我的感受是这门工具难的地方不在语法而在于你怎么给它定边界。fixture 的粒度、参数化的数据维度、测试目录的职责划分把这些设计清楚了后面的维护成本是持续下降的。我也把这个结构原样迁移到过别的项目里从数据处理脚本到 Web 服务都没怎么费劲因为 Pytest 的心智模型是通用的依赖注入、数据驱动、按标记分类、报告可观测。最后再留一个小技巧提交代码前先跑一遍pytest --lf确认上次的失败真的修复了再跑全量回归。多花这两三分钟能帮你避免好多次把坏代码合进主干线的后悔时刻。

相关新闻

考虑储能与新能源误差的售电公司购售电策略优化

考虑储能与新能源误差的售电公司购售电策略优化

1. 题目拆解:这个策略到底在解决售电公司的什么痛点拿到这个题目,先别急着看代码。我们需要把“考虑储能和可再生能源误差的售电公司购售电策略”这句话拆开,看清楚它到底在解决一个什么样的现实问题。售电公司这个角色,是电力市场…

2026/10/15 6:24:44 阅读更多 →
TCL脚本编程入门:解释器、字符串处理与实战避坑指南

TCL脚本编程入门:解释器、字符串处理与实战避坑指南

简介:这份中文版TCL教程PDF,定位为脚本语言入门与进阶的中文参考手册,面向自动化运维、嵌入式开发及需要编写脚本工具的技术人员。内容覆盖TCL核心语法、置换、变量、表达式、List、控制流、过程、字符串操作、文件访问、错误与异常&#xff…

2026/10/15 6:24:44 阅读更多 →
从问卷原始数据到可读热力图:matplotlib与seaborn实战指南

从问卷原始数据到可读热力图:matplotlib与seaborn实战指南

1. 从问卷原始数据到可读热力图:为什么这一步值得单独拿出来讲问卷数据大概是所有数据里最"脏"的一类。你回收上来的是几百上千行、每行几十列的原始记录,选项是"非常满意/满意/一般/不满意"这种文本,还夹杂着跳答、多选…

2026/10/15 6:24:44 阅读更多 →

最新新闻

.NET 11 Preview 2 架构演进:AOT、动态PGO与GC改进实践

.NET 11 Preview 2 架构演进:AOT、动态PGO与GC改进实践

.NET 11 Preview 2 放出来的时候,我第一反应不是去翻新 API 列表,而是先看运行时仓库里的架构改动。这次 Preview 社区讨论最热的点,居然不是某个炫酷的 C# 语法糖,而是 AOT 成熟度、动态 PGO、GC 暂停时间这一类偏底层的东西。这…

2026/10/15 7:02:52 阅读更多 →
涨价周期下的内存升级:32GB为什么成为主流选择

涨价周期下的内存升级:32GB为什么成为主流选择

看到这个标题的时候,我第一反应是:这大概就是今年装机和升级内存最真实的一面。内存价格在这一轮行情里坐着火箭往上走,可周围朋友的配置单却一个比一个“胖”,去年还在纠结16GB够不够用,今年好多人的新机器直接填了32…

2026/10/15 7:02:52 阅读更多 →
上下文模式(Context-Mode)工程实践:传递、隔离与切换

上下文模式(Context-Mode)工程实践:传递、隔离与切换

1. 从“上下文模式”这个命名说起:它到底在解决什么问题第一次看到“context-mode”这个词,很多人会下意识地把它当成某个框架里的配置项,或者某个库的开关参数。但如果你真的在工程一线待过几年,就会发现这个词背后藏着一个非常朴…

2026/10/15 7:02:52 阅读更多 →
PyTorch实战全链路:从动态图原理到多卡部署的深度避坑指南

PyTorch实战全链路:从动态图原理到多卡部署的深度避坑指南

1. 为什么“pytorch”这个标题值得单独拎出来聊如果你在技术社区里闲逛,看到有人只甩出一个词——“pytorch”,然后就没下文了,大概率会以为这是个新手在问“这玩意儿怎么装”。但实际情况恰恰相反,越是只写一个词,越说…

2026/10/15 7:02:52 阅读更多 →
NSGA-II在综合能源优化调度中的Matlab实战与调试经验

NSGA-II在综合能源优化调度中的Matlab实战与调试经验

做综合能源优化调度的同学,大概率都遇到过同一个尴尬:手上既有光伏、风电的出力预测曲线,又有燃气轮机、储能、电锅炉的设备模型,心里也清楚要同时降成本、减碳排放、提高能效,可真到用Matlab把这套多目标调度逻辑写出…

2026/10/15 7:02:52 阅读更多 →
C++多态原理:编译时与运行时多态及虚函数机制详解

C++多态原理:编译时与运行时多态及虚函数机制详解

1. 从形状计算看多态的本质:为什么我们需要它前两天整理 C 多态笔记时,我想起了自己在某个图形项目里写过的一段“黑历史”:刚开始接触面向对象时,我以为多态就是“给函数加个 virtual”,结果写出来的形状面积计算全是…

2026/10/15 7:01:52 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →