Python subprocess.run() 在 Windows 下 FileNotFoundError 的根源与最佳实践
1. 问题现象与初步排查一个看似简单的命令为何“找不到文件”最近在写一个自动化脚本用 Python 的subprocess.run()去调用一个外部程序代码看起来简单明了但在 Windows 上运行时却冷不丁地弹出一个FileNotFoundError: [WinError 2] 系统找不到指定的文件。这个错误对于刚接触 Python 系统交互或者从 Linux 环境切换到 Windows 的开发者来说算是一个经典的“入门坑”。你可能会反复检查路径确认文件明明就在那里权限也没问题但 Python 就是告诉你找不到。这种挫败感我懂。这个错误的本质并不是你的目标可执行文件真的不存在而是subprocess.run()在默认行为下对第一个参数即要执行的命令的解析逻辑在 Windows 和类 Unix 系统如 Linux、macOS上有根本性的差异。在 Linux 下你写subprocess.run([‘ls‘, ‘-la‘])能顺利执行是因为系统知道ls这个命令位于PATH环境变量所包含的目录中。但在 Windows 下如果你写subprocess.run([‘dir‘])就会立刻触发这个WinError 2。原因在于dir是 Windows 命令提示符cmd.exe的一个内部命令而不是一个独立的、位于磁盘某个路径下的.exe可执行文件。subprocess.run()的默认行为是直接寻找名为dir.exe或dir.bat这样的文件显然找不到于是报错。所以当你遇到这个错误时第一步不是怀疑人生而是应该立刻明确两个关键点第一你要运行的到底是一个独立的可执行程序如python.exe、git.exe、ping.exe还是 Windows shellcmd 或 PowerShell的一个内置命令如dir、copy、echo第二你传递给subprocess.run()的参数列表是否正确对于内置命令或包含空格、特殊字符的路径处理方式完全不同。接下来我们就从最基础的参数传递开始彻底拆解这个问题。2.subprocess.run()参数解析shellTrue背后的机制与抉择要解决“找不到文件”的问题核心在于理解subprocess.run()的shell参数。这个参数默认为False但它在 Windows 和 Linux 下的行为天差地别是绝大多数跨平台脚本错误的根源。2.1 当shellFalse时默认情况在这种模式下subprocess模块会尝试直接执行你提供的第一个参数或参数列表的第一个元素。它期望这个参数是一个可执行文件的完整路径或者是一个能在系统PATH环境变量中找到的程序名。在 Linux/macOS 下大部分常用命令如ls,grep,cat其实都是独立的可执行文件位于/bin、/usr/bin等目录下。因此subprocess.run([‘ls‘, ‘-l‘])可以工作因为系统能在PATH里找到/bin/ls。在 Windows 下情况就复杂了。对于独立的.exe文件如python、notepad如果它在PATH中可以直接写程序名subprocess.run([‘python‘, ‘--version‘])。但是对于cmd 的内部命令如dir,copy,type,echo它们不是.exe文件而是命令解释器cmd.exe的一部分。当你传递[‘dir‘]时Python 会去PATH里找dir.exe当然找不到于是抛出FileNotFoundError。同样对于批处理文件 (.bat) 或 PowerShell 脚本 (.ps1)如果你只写脚本名也需要shellTrue或指定解释器来执行。所以在 Windows 下如果你要执行的是dir这类命令默认的shellFalse模式是行不通的。这就是报错的直接原因。2.2 当shellTrue时将shell参数设为True是解决这个问题的关键钥匙之一。此时subprocess.run()的行为会发生根本变化命令通过系统 Shell 执行在 Windows 上它会启动一个cmd.exe进程默认然后将整个命令字符串传递给它去解析和执行。cmd.exe认识它的所有内部命令。参数传递方式变化当使用shellTrue时强烈建议你将命令作为一个单独的字符串传递而不是一个列表。例如subprocess.run(‘dir /w‘, shellTrue)。如果你传递一个列表如subprocess.run([‘dir‘, ‘/w‘], shellTrue)在 Windows 上通常只有列表的第一个元素会被cmd.exe接收后面的参数可能会被忽略导致非预期行为。为什么使用字符串因为shellTrue意味着“请系统 Shell 来解析这条命令”。Shell 有自己的一套解析规则比如处理空格作为参数分隔符、识别重定向符 (,)、管道 (|) 等。将一个完整的命令字符串交给 Shell让它按照自己的规则去拆分和执行是最符合其工作模式的做法。示例对比# 错误列表形式 shellTrue在Windows上可能异常 subprocess.run([‘echo‘, ‘Hello World‘], shellTrue) # ‘Hello World‘ 可能不会被输出 # 正确字符串形式 shellTrue subprocess.run(‘echo Hello World‘, shellTrue) # 正常输出 Hello World # 正确执行带路径的程序且参数复杂时也可以字符串形式 subprocess.run(‘“C:\\Program Files\\MyApp\\app.exe“ --input “file with spaces.txt“‘, shellTrue)2.3shellTrue的安全隐患与性能考量虽然shellTrue能解决眼前的问题但它是一把双刃剑不能无脑使用。安全风险这是最大的问题。如果你的命令字符串来自用户输入或外部数据使用shellTrue会引入严重的命令注入漏洞。恶意用户可能通过构造特殊的字符串来执行任意命令。例如user_input ‘somefile.txt; rm -rf /‘ # 恶意输入 subprocess.run(f‘type {user_input}‘, shellTrue) # 灾难当shellFalse并使用列表形式时参数会被安全地传递不会被 Shell 再次解析从而免疫此类攻击。性能开销启动一个额外的 Shell 进程cmd.exe会产生微小的性能开销。对于需要频繁调用外部命令的脚本这个开销累积起来可能变得显著。平台行为差异shellTrue时使用的默认 Shell 在不同平台不同Windows 是 cmdLinux 通常是/bin/sh。这可能导致同一命令字符串在不同系统上行为不一致破坏跨平台性。因此一个核心原则是除非必要否则避免使用shellTrue。那么在必须执行 Shell 内部命令或处理复杂命令行时如何安全地避免FileNotFoundError呢这就引出了我们的最佳实践。3. 最佳实践如何安全、跨平台地调用外部命令理解了问题和风险后我们可以制定一套清晰、安全的最佳实践方案从根本上避免FileNotFoundError并写出健壮的代码。3.1 方案一显式指定 Shell 解释器推荐用于必须使用 Shell 功能的场景这是最清晰、跨平台兼容性最好的方法。思路是我们不依赖默认的、模糊的shellTrue行为而是明确告诉subprocess.run我们要运行的是cmd.exe或powershell.exe、bash这个具体的程序并且把要执行的命令作为参数传给它。对于 Windows cmd 命令import subprocess # 执行 dir 命令 result subprocess.run([‘cmd‘, ‘/c‘, ‘dir‘, ‘/w‘], capture_outputTrue, textTrue) print(result.stdout) # 执行一条包含管道(|)的命令 result subprocess.run([‘cmd‘, ‘/c‘, ‘dir | findstr “.py“‘], capture_outputTrue, textTrue)‘cmd‘指定运行cmd.exe。‘/c‘是 cmd 的参数表示“执行后续字符串指定的命令然后终止”。与之对应的是/k表示执行后保持窗口打开交互式。后续所有部分都是cmd.exe的参数合起来就是cmd /c “dir /w“。这里我们用了列表形式将整个逻辑清晰地分解了。对于 Windows PowerShell 命令# 执行 PowerShell 命令 result subprocess.run([‘powershell‘, ‘-Command‘, ‘Get-ChildItem‘], capture_outputTrue, textTrue) # 执行复杂的 PowerShell 脚本块 ps_script ‘“Get-Process | Where-Object { $_.CPU -gt 10 } | Select-Object Name, CPU“‘ result subprocess.run([‘powershell‘, ‘-Command‘, ps_script], capture_outputTrue, textTrue)‘-Command‘(-c) 参数告诉 PowerShell 执行后面的命令字符串。这种方法的好处安全避免了shellTrue的命令注入风险因为命令是作为参数传递给cmd或powershell的而不是由 Python 启动的 Shell 直接解析。清晰代码明确指出了使用哪种 Shell可读性更强。跨平台思路一致在 Linux 下你可以类似地使用[‘bash‘, ‘-c‘, ‘ls -la‘]。这形成了统一的模式。3.2 方案二使用shlex.split()处理复杂命令字符串适用于类Unix系统或Windows PowerShell有时你不得不从一个复杂的命令字符串开始比如从配置文件中读取。为了安全地将其转换为subprocess.run所需的列表形式可以使用shlex.split()函数。它能像 Shell 一样智能地分割字符串正确处理引号内的空格。import subprocess, shlex command_string ‘echo “Hello World“ ping -n 3 127.0.0.1‘ # 在 Windows 上直接 split 可能不对。通常更推荐方案一。 # 但对于从类Unix环境移植的简单命令或确定使用PowerShell时可以谨慎使用。 # 注意 是cmd的运算符这里仅作分割演示运行仍需shell。 args_for_shell shlex.split(command_string, posixFalse) # posixFalse 适应Windows路径 print(args_for_shell) # 输出: [‘echo‘, ‘Hello World‘, ‘‘, ‘ping‘, ‘-n‘, ‘3‘, ‘127.0.0.1‘] # 如果要在Windows上运行上述命令仍需shell或cmd result subprocess.run(‘cmd /c ‘ command_string, shellTrue) # 或用方案一注意shlex.split()主要用于类 Unix Shell 的语法分割。在 Windows 上对于包含、||、等Shell 运算符的命令即使分割成列表也无法直接通过shellFalse执行因为这些运算符需要 Shell 来解释。此时方案一显式调用cmd /c仍然是更稳妥的选择。3.3 方案三处理文件路径与工作目录FileNotFoundError也可能是因为可执行文件路径本身不对。除了使用shellTrue或显式调用 Shell还要注意使用原始字符串或双反斜杠Windows 路径中的反斜杠\是转义字符。推荐使用原始字符串或双反斜杠。# 推荐 subprocess.run(r‘C:\Program Files\MyApp\app.exe‘) subprocess.run(‘C:\\Program Files\\MyApp\\app.exe‘) # 易错 subprocess.run(‘C:\Program Files\MyApp\app.exe‘) # ‘\P‘ 和 ‘\M‘ 可能被转义处理包含空格的路径用引号包裹整个路径。# 在字符串命令中 subprocess.run(‘“C:\\Program Files\\MyApp\\app.exe“ --help‘, shellTrue) # 在列表形式中路径本身作为一个元素即可 subprocess.run([r‘C:\Program Files\MyApp\app.exe‘, ‘--help‘])设置cwd当前工作目录有些程序使用相对路径如./data/config.ini。你需要通过cwd参数指定命令运行的工作目录。subprocess.run([‘python‘, ‘script.py‘], cwdr‘D:\my_project‘)3.4 实战决策流程图面对一个调用需求你可以遵循以下流程做出选择我要调用的是什么独立的.exe、.bat、.ps1文件或可在PATH中找到的程序- 尝试使用shellFalse 列表形式。确保路径正确必要时用cwd。Shell 内部命令如dir,copy或包含 Shell 运算符|,,的命令- 进入步骤2。是否需要跨平台安全性要求如何是或要求高安全-采用方案一显式指定 Shell 解释器。subprocess.run([‘cmd‘, ‘/c‘, ‘your_command‘])或subprocess.run([‘powershell‘, ‘-Command‘, ‘your_command‘])。这是最推荐的做法。否仅限 Windows 快速脚本且命令字符串完全可控- 可以谨慎使用shellTrue 命令字符串。务必确保命令字符串是硬编码或经过严格校验的。遵循这个流程可以极大地减少FileNotFoundError以及其它相关错误。4. 高级场景与深度排错指南即使掌握了最佳实践在一些复杂场景下你可能还是会遇到令人困惑的问题。这一章我们深入这些“坑”并提供排错方法。4.1 环境变量PATH的影响与诊断FileNotFoundError有时是因为你的 Python 进程继承的PATH环境变量与你在终端中看到的不同。特别是在 IDE如 PyCharm中运行、或通过计划任务、系统服务启动脚本时。诊断方法import os, subprocess print(“Python 进程的 PATH:“, os.environ.get(‘PATH‘)) # 对比在代码中手动添加路径到环境变量副本 my_env os.environ.copy() my_env[‘PATH‘] r‘C:\MyTools;‘ my_env[‘PATH‘] # 在开头添加自定义路径 result subprocess.run([‘my_tool.exe‘, ‘arg1‘], envmy_env, capture_outputTrue, textTrue)如果my_tool.exe位于C:\MyTools下上述代码就能工作而直接调用可能失败。这证明了是PATH问题。在 PyCharm 中运行配置可能使用了特定的环境变量。检查Run/Debug Configurations下的Environment variables设置。4.2 文件扩展名与PATHEXT在 Windows 命令行中当你输入python时系统不仅会在PATH中寻找python还会依次尝试加上PATHEXT环境变量中列出的扩展名如.COM;.EXE;.BAT;.CMD;.VBS;...。但subprocess.run在shellFalse时不会自动附加这些扩展名。它要求你提供的路径或名称必须精确匹配可执行文件。# 假设当前目录下有一个 myscript.bat # 这在 cmd 中可行因为 .bat 在 PATHEXT 中 # subprocess.run(‘myscript‘, shellTrue) # 可行 # 但这不可行因为 subprocess 不会自动加 .bat subprocess.run([‘myscript‘]) # FileNotFoundError # 必须提供完整文件名 subprocess.run([‘myscript.bat‘]) # 正确因此对于批处理或脚本文件要么使用完整文件名要么通过shellTrue或显式调用cmd来利用系统的查找机制。4.3 用户权限与文件关联权限问题尝试执行一个当前用户没有权限访问的可执行文件也可能导致类似“找不到文件”的错误有时是PermissionError。确保 Python 进程以足够的权限运行。文件关联在 Windows 中像.py这样的文件通常关联到python.exe。当你双击.py文件时系统会调用python.exe来运行它。但在subprocess.run中你不能直接run([‘myscript.py‘])因为.py本身不是可执行文件。你必须明确指定解释器run([‘python‘, ‘myscript.py‘])。4.4 使用subprocess的其他函数进行探索subprocess模块提供了更底层的函数可以帮助诊断subprocess.list2cmdline(): 这个函数可以将一个参数列表转换成 Windows 命令行下使用的字符串。你可以用它来检查你构造的列表被转换成什么样子特别是路径中的空格和特殊字符是否被正确处理。import subprocess args [‘program.exe‘, ‘--input‘, ‘C:\\My Documents\\file.txt‘] cmd_string subprocess.list2cmdline(args) print(cmd_string) # 输出: program.exe --input “C:\\My Documents\\file.txt“subprocess.check_output(),subprocess.call(): 它们是subprocess.run()的早期版本。run()是更现代、功能更全面的接口建议在新代码中统一使用run()。4.5 一个综合排错案例假设你在脚本中调用一个第三方命令行工具ffmpeg出现了FileNotFoundError。第一步确认命令在终端中可行。 打开cmd或PowerShell手动输入ffmpeg -version。如果不行说明ffmpeg没有安装或不在PATH中。你需要将其安装目录如C:\ffmpeg\bin添加到系统环境变量PATH或者在你的 Python 脚本中使用绝对路径。第二步在 Python 中复现终端命令。如果终端中命令是ffmpeg -i input.mp4 output.avi并且工作正常。在 Python 中首先尝试最安全的方式import subprocess, shutil # 方法A使用 which/where 查找程序跨平台 ffmpeg_path shutil.which(‘ffmpeg‘) if ffmpeg_path: subprocess.run([ffmpeg_path, ‘-i‘, ‘input.mp4‘, ‘output.avi‘]) else: print(“ffmpeg 未在 PATH 中找到请使用绝对路径。“)如果shutil.which也找不到但你确定路径就直接用绝对路径subprocess.run([r‘C:\Users\Me\Tools\ffmpeg.exe‘, ‘-i‘, ‘input.mp4‘, ‘output.avi‘])第三步处理复杂参数。 如果输入/输出文件名包含空格或特殊字符确保它们在参数列表中作为一个独立的字符串元素并且路径字符串本身被正确转义。# 文件名包含空格 subprocess.run([ffmpeg_path, ‘-i‘, r‘C:\My Videos\my video.mp4‘, ‘output.avi‘]) # 注意 r‘...‘ 原始字符串避免了转义麻烦第四步捕获输出以调试。 如果还是失败使用capture_outputTrue和textTrue来捕获标准错误stderr那里通常有更详细的错误信息。result subprocess.run([ffmpeg_path, ‘-i‘, ‘input.mp4‘, ‘output.avi‘], capture_outputTrue, textTrue) if result.returncode ! 0: print(“命令执行失败“) print(“标准输出:“, result.stdout) print(“标准错误:“, result.stderr) # 这里往往藏着真正的错误原因通过这样层层递进的排查绝大多数FileNotFoundError都能被定位和解决。核心思想就是理解subprocess.run在不同模式下的行为差异明确你要执行的对象的性质是独立程序还是 Shell 命令然后选择最安全、最清晰的方式去调用它。在 Windows 上养成显式调用cmd /c或powershell -Command的习惯能让你的脚本更加健壮和可维护。

相关新闻

Linux下AD3552/AD3551 DAC驱动开发:从IIO框架到DMA高速数据传输

Linux下AD3552/AD3551 DAC驱动开发:从IIO框架到DMA高速数据传输

1. 项目概述:从芯片到系统,驱动开发的桥梁作用最近在搞一个高精度数据采集的项目,核心用到了ADI的AD3552和AD3551这两颗高速、高精度的DAC。芯片手册翻了好几遍,硬件电路也调通了,但真要让这颗芯片在嵌入式Linux系统里…

2026/10/14 11:50:09 阅读更多 →
C语言scanf与printf深度解析:从格式化I/O到内存安全实践

C语言scanf与printf深度解析:从格式化I/O到内存安全实践

1. 从“Hello World”到数据交互:为什么scanf和printf是C语言的基石如果你刚开始学C语言,第一个遇到的函数大概率是printf,用它向屏幕打印出“Hello World”。紧接着,当你需要从键盘获取一个数字或一串字符时,就会遇到…

2026/10/14 14:36:33 阅读更多 →
深入NIO核心:从Selector空轮询到零拷贝,攻克高并发网络编程实战难点

深入NIO核心:从Selector空轮询到零拷贝,攻克高并发网络编程实战难点

面试官问:“NIO和BIO有什么区别?”你自信地回答:“BIO是阻塞IO,NIO是非阻塞IO,NIO有Buffer和Channel。”面试官点点头,接着问:“那Selector在NIO里起什么作用?零拷贝在NIO中是如何实…

2026/10/13 14:14:49 阅读更多 →

最新新闻

Unity 2D推箱子开发核心:Tilemap、Rigidbody2D与Grid协同原理

Unity 2D推箱子开发核心:Tilemap、Rigidbody2D与Grid协同原理

1. 为什么“推箱子”是2D游戏开发者的必修课很多人第一次听说“Unity做2D推箱子”,下意识觉得:不就是个老掉牙的益智小游戏?画几个方块、写几行移动逻辑,拖进编辑器点运行——完事。但我在带教某高校游戏开发实训课时发现&#xf…

2026/10/14 14:36:51 阅读更多 →
DSP实验报告写作指南:从FFT频谱分析到滤波器设计全流程

DSP实验报告写作指南:从FFT频谱分析到滤波器设计全流程

简介:面向数字信号处理课程学习者的DSP实验指导书与最终实验报告合集,覆盖循环操作、双操作数乘法、并行运算、小数与长字运算、浮点运算、卷积及相关运算等核心实验,适合本科或高职学生对照课程进度完成实验、撰写报告与期末复习。压缩包共2…

2026/10/14 14:36:51 阅读更多 →
二阶锥规划在动态最优潮流计算中的应用与实践

二阶锥规划在动态最优潮流计算中的应用与实践

1. 项目背景与核心价值电力系统最优潮流(OPF)问题一直是电网运行的核心课题。传统配电网中,我们通常假设潮流是单向流动的——从变电站流向用户端。但随着分布式电源(光伏、风电等)的大规模接入,现代配电网…

2026/10/14 14:35:50 阅读更多 →
FastAPI GPU推理并发控制:显存预估与队列准入实战

FastAPI GPU推理并发控制:显存预估与队列准入实战

1. 为什么这个标题一出现,我就立刻停下手头三个项目去验证?FastAPI GPU推理并发控制——这八个字背后,是过去两年我踩过最深、最痛、也最常被低估的坑。不是模型精度不够,不是API响应慢,而是请求刚到第17个&#xff0c…

2026/10/14 14:35:50 阅读更多 →
免费代理服务评测与GoodIps.com使用实践

免费代理服务评测与GoodIps.com使用实践

1. 网络代理服务选型与质量评估实践作为经常需要测试不同地区网络环境的开发者,我一直在寻找稳定可靠的代理服务资源。最近半年我系统性地测试了市面上十几个声称提供免费代理服务的网站,从连接成功率、响应速度、IP可用时长、更新频率等多个维度进行了详…

2026/10/14 14:35:50 阅读更多 →
青岛市shp数据解压与转换全攻略:从shp/shx/json到GIS实战

青岛市shp数据解压与转换全攻略:从shp/shx/json到GIS实战

简介:这份资源是面向GIS初学者、地理信息专业学生及城市规划从业者的青岛市区域划分地理数据包,可用于地图制作、空间分析与规划决策等场景。压缩包共5个文件,约43KB,包含shp主数据文件(存储几何形状)、dbf…

2026/10/14 14:35:50 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

2026/10/13 16:22:04 阅读更多 →
影刀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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →