Python导包报错排查:__name__、相对导入与python -m的机制解析
接触Python这些年如果说哪个环节最能消耗耐心导包绝对排得上号。明明逻辑没问题一运行就给你抛个ImportError本地环境一切正常换台机器就是找不到模块更诡异的是用python xxx.py跑报错换成python -m xxx却好了。如果你撞上过这些状况大概率已经和__name__、python -m、相对导入relative import、父包parent package这几个概念打过照面。这篇文章就是针对这些玄学问题的一次系统性复盘。主角是四个关键词__name__、python -m、相对导入relative import、父包parent package它们共同决定了Python模块与包的导入行为。我会从模块和包的基本概念讲起把导入机制背后的逻辑链条彻底拆开再用一个实际项目结构演示一套不会踩坑的写法。适合刚入门Python、或者被导入问题折磨过的开发者收藏细读。1. 先搞清楚这些报错到底是你写错了还是跑错了1.1 典型症状自检先别急着改代码对照一下自己有没有遇到过下面这几种症状。症状A在一个b.py里写了from . import a直接运行python mypkg/b.py结果报错ImportError: attempted relative import with no known parent package。你觉得自己明明按规矩写了相对导入Python却不认账。症状B项目结构是project/mypkg/core.py你在project目录下运行python main.py没毛病但把main.py挪到project/mypkg/里运行立刻报ModuleNotFoundError: No module named mypkg。代码一行没改只是换了个启动位置世界就变了。症状Cpython mypkg/b.py报错后你改成python -m mypkg.b居然就好了。网上说这样能解决但你不知道原理下次换个场景照样踩坑。这些症状背后有一个共同的根源运行方式决定了模块的身份而身份决定了导入规则。很多人吃亏就吃在把运行一个文件和执行一个模块当成了同一件事实际上它们在Python解释器眼里是完全不同的两套机制。1.2 根因执行方式与导入机制错配Python里所有关于导入的规则本质上都是在回答三个问题这段代码正在以什么身份运行是主角顶层脚本还是配角被导入的模块——这由__name__决定。这个模块属于哪个包——这由__package__决定相对导入全靠它。解释器从哪些路径寻找模块——这由sys.path决定。如果你用错误的方式运行了代码比如让一个注定要当包内子模块的文件去做顶层主角那么后两个问题就会出现矛盾__package__为空相对导入找不到锚点sys.path又指向了不该指向的目录绝对导入也连带着出问题。于是各种报错接踵而至。1.3 这篇文章的阅读路线接下来的内容我会先把模块、包、__name__、sys.path这几个地基概念讲透再用实验展示它们在实际运行时的值然后重点拆解python -m和直接运行的本质差异解释相对导入为什么必须有父包最后给出一套我实际项目里验证过多次的目录结构和启动习惯以及一张高频报错对照表。如果你已经爆过几次雷可以直接跳到最后两节找对策但建议还是回头把第二节读完否则容易知其然不知其所以然。2. 基础概念一次看清模块、包、name、sys.path2.1 模块和包两种形态一个本质Python里最常见的模块module就是一个.py文件。比如你写了一个utils.py它就成为一个叫utils的模块其他代码可以用import utils把它加载进来。这很好理解但很多人会忽略一个关键事实模块名不是路径而是符号名。import utils不是读取这个文件那么机械而是把名为utils的模块对象注册到当前运行时里。包package稍微复杂一点。早期版本里一个目录只要包含__init__.py文件就是一个包Python 3.3之后引入了命名空间包namespace package没有__init__.py的目录在某些情况下也能被当作包处理。但为了稳健我仍然建议你保留__init__.py哪怕它是空的。包里可以再嵌套包结构上就是一层层的目录但逻辑上包本身就是一种特殊的模块——它的名字就是目录名它的代码就是__init__.py里的内容。理解这一点很重要因为import mypkg.core这种写法在解释器眼里等价于先加载名为mypkg的包模块再访问它的子模块core。你表面上是在写路径式的导入实际上是在操作一个模块树的命名空间。2.2name这段代码是主角还是配角__name__是一个字符串Python解释器给每个模块都准备了这样一个变量用来标识模块的身份。但它不是固定不变的当一个文件作为脚本被直接运行时它会被赋予一个特殊的模块名__main__于是__name__ __main__当一个文件被其他代码导入时__name__就是它的模块路径名比如mypkg.core。这就是那句经典写法if __name__ __main__:的全部含义。放在这个判断里的代码只有在该文件被当作主角直接运行时才会执行当它被import时就只是注册和赋值不会执行属于主程序的那部分逻辑。很多人把这个写法背下来但不理解所以遇到我明明加了判断为什么还会被执行之类的问题就蒙了——实际上是你没有检查你的模块是以什么身份被拉起来的。还有一个关联属性叫__package__。它记录的是这个模块所属的包的名字。顶层模块的__package__是空字符串包内子模块的__package__则是它的父包名。相对导入能不能成功就看__package__是否正确。这是后文的核心中的核心提前做个记号。2.3 sys.pathPython的寻宝路线sys.path是一个列表里面是所有模块搜索路径。当你执行import xxx时解释器会按照这个列表的顺序一个个去目录里查找名为xxx.py的文件、名为xxx的包目录或者已注册的内置模块。找到就停找不到就往下一个路径走直到抛ModuleNotFoundError。这个列表通常包含以下几个来源脚本所在目录或当前工作目录取决于调用方式这一点非常关键。环境变量PYTHONPATH里配置的路径。标准库目录。第三方库目录通常是site-packages。你可以随时在代码里打印sys.path看当前的真实内容。很多导入问题打印一下这个列表就能立刻破案——不是代码写错而是Python压根没把项目根目录放进搜索路径。2.4 亲手实验用两个小文件看透导入过程光讲概念不够我们直接动手。建一个临时目录/tmp/demo里面放两个文件。# a.py print(a.py __name__ , __name__) print(a.py __package__ , __package__)# b.py import a print(b.py __name__ , __name__) print(b.py __package__ , __package__)先运行python a.py输出a.py __name__ __main__ a.py __package__ 此时a.py是顶层脚本__name__是__main____package__为空。再运行python b.py输出a.py __name__ a a.py __package__ b.py __name__ __main__ b.py __package__ 注意看a.py被导入后它的__name__变成了a但__package__依然是空。为什么因为它没有父包它就是一个躺在根目录里的裸模块。这时如果你在a.py里写from . import xxx必然报错——点号不知道该指向哪里。接下来把这个实验放到包结构里/tmp/demo2/ └── mypkg/ ├── __init__.py ├── a.py └── b.pyb.py里改成from . import a print(mypkg.b is running) print(a __name__ , a.__name__)然后在/tmp/demo2目录下运行python -m mypkg.b输出mypkg.b is running a __name__ mypkg.a看到了吗同样一个b.py用python -m mypkg.b运行时a的身份变成了mypkg.a它有了完整的包路径。这才是相对导入能成立的前提模块必须带着包的身份被加载而不是被当作裸脚本直接执行。3. python -m 到底改变了什么为什么相对导入必须有父包3.1 两种运行方式背后的机制差异这是全篇最核心的一节。两种运行方式python script.py和python -m module.path之间到底有什么不同我用下表做一个直观对比对比维度python direct.pypython -m pkg.modulesys.path[0]脚本所在目录当前工作目录模块身份__main__pkg.module__package__空字符串pkg相对导入不可用可用是否需要包结构不需要直接指文件需要按模块路径解析典型使用场景运行入口脚本运行包内模块、命令行工具第一行最容易被人忽略但它恰恰解释了很多找不到模块的问题。python direct.py会把脚本所在的目录插到sys.path的最前面而不是你当前所在的目录python -m pkg.module则会把当前工作目录插到最前面。举个例子你在project/mypkg/目录下执行python b.py那sys.path[0]是project/mypkg/所以import a能成功from mypkg import a反而失败因为project根本没在搜索路径里。反过来你在project目录下执行python -m mypkg.bsys.path[0]是project所以from mypkg.b import xxx能成功而直接import a失败因为a不在project下。这就是为什么代码没问题换个启动方式就正常——不是玄学是sys.path[0]的指向变了。3.2 相对导入中的点号到底在指什么相对导入的语法里from . import a和from ..core import base这种写法中的点号不是当前目录这么简单。from . import a是从当前模块所在的包中导入a模块from ..core import base是从当前模块所在包的上一级包里的core子包中导入base模块。那个当前模块所在的包必须由__package__这个属性来确定。当__package__是真实的包名时点号才有坐标可依当它是空值时解释器完全不知道要往哪一层去偏移只能抛出ImportError: attempted relative import with no known parent package。这就是相对导入必须有父包的直接来源。你写的相对导入语法没有错错的是运行环境没有给它一个合法的父包上下文。3.3 为什么顶层脚本不能使用相对导入有人会问我在根目录写一个main.py里面用from . import xxx是不是也行答案是绝对不行。因为main.py被直接运行时__main__模块的__package__是空的它自己没有父包那点号没有任何意义。强行使用相对导入解释器只会报错。更隐蔽的一个坑是即使你的脚本在包目录里直接运行也一样不行。比如mypkg/b.py文件明明就在mypkg包里你运行python mypkg/b.py它仍然是顶层脚本__package__仍然为空相对导入照样报错。脚本的位置写在磁盘上不如它加载时的身份重要——只要它是被当成一个裸文件执行的它就不算包的一部分哪怕物理位置在包里。这也解释了为什么入口脚本和普通模块在项目里必须分开入口脚本负责启动普通模块负责业务角色不能混淆。3.4 正反案例演示同一个模块两种命运我们用一组真实代码来演示。项目结构如下myproject/ ├── main.py └── mypkg/ ├── __init__.py ├── a.py └── b.py# mypkg/a.py def hello(): return hello from a# mypkg/b.py from . import a def greet(): return a.hello()# main.py from mypkg.b import greet if __name__ __main__: print(greet())情况一python mypkg/b.py直接报错。b.py被视为顶层脚本__package__为空from . import a找不到父包。情况二python main.py正常输出hello from a。main.py是顶层入口它用绝对导入from mypkg.b import greet没有任何相对导入。情况三如果b.py的末尾加上一行print(greet())再运行python -m mypkg.b会正常输出。b.py以mypkg.b的身份运行相对导入成立模块里的打印代码也随之执行。情况四还是在b.py末尾加但运行python main.py不会打印第二行因为b.py此时是被导入的模块它的名字是mypkg.b而不是__main__那句判断不命中等等我们没加if。这里要说清楚如果b.py里的打印语句不在if __name__ __main__:保护下那么被main.py导入时同样会执行。所以写在这个保护区块里的代码才是运行该文件专属的代码。这个区别用多了自然就形成了肌肉记忆。4. 实战一套不会踩坑的项目结构与启动习惯4.1 推荐的标准结构长什么样理论讲透了现在落到实际项目。我见过太多人把入口文件、模块、测试全扔在同一个目录里也可能是随手建几个文件夹然后到处硬凑sys.path。这里推荐一套我长期使用的目录结构project/ ├── main.py ├── mypkg/ │ ├── __init__.py │ ├── core/ │ │ ├── __init__.py │ │ └── base.py │ └── utils/ │ ├── __init__.py │ └── helpers.py ├── tests/ │ ├── conftest.py │ └── test_helpers.py └── requirements.txt这套结构有三大原则第一条入口文件永远放在包外面。main.py的任务只有一个导入包里的模块并启动程序。它不写业务逻辑更不做包内模块之间的相对导入。这样它无论被python main.py还是python -m main运行都一样安全。第二条包内模块之间统一使用相对导入或基于包根的绝对导入。例如helpers.py要调用base.py可以写from ..core.base import make_id也可以写from mypkg.core.base import make_id。两种都能跑但相对导入的好处是以后如果整个包被改名或挪到新的父包下内部引用不会断。第三条所有运行命令都要从项目根目录发起。这一点怎么强调都不过分。因为无论是直接运行还是python -m模块搜索路径都和启动位置强相关。养成先cd到根目录再执行的习惯能避免大量莫名其妙的ModuleNotFoundError。4.2 从零拉通一个完整的相对导入示例把上面的结构填充成可运行代码。先看core/base.py# mypkg/core/base.py def make_id(): return BASE-001再看utils/helpers.py这里故意使用相对导入来展示包内模块互引# mypkg/utils/helpers.py from ..core.base import make_id def build_message(): return fhelper says: {make_id()}main.py只负责从包的最外层导入# main.py from mypkg.utils.helpers import build_message if __name__ __main__: print(build_message())在project目录下执行python main.py输出helper says: BASE-001这就是一条完整的链路入口脚本 → 包 → 子包 → 相对导入。整个过程里helpers.py的from ..core.base依赖的是helpers.py自己的__package__值mypkg.utils所以跨子包的相对导入可以正常工作。如果想把包内某个模块也做成可单独运行的命令行工具规范做法是给这个模块增加一个入口层。比如在根目录放一个run_helper.py# run_helper.py from mypkg.utils.helpers import build_message if __name__ __main__: print(build_message())而不是去helpers.py里乱加if __name__ __main__这样的主程序逻辑。入口归入口模块归模块职责边界越清晰导入问题越少。4.3 不同运行场景下的注意事项实际开发里你还会遇到测试、调试、打包等多个场景每个场景都有不同的导入语境。pytest测试很多人直接在项目根目录跑pytest tests/然后被ModuleNotFoundError折磨。pytest会自动把根目录加入sys.path但它的判断规则有时并不符合你的预期。最稳妥的做法是运行python -m pytest tests/这样sys.path[0]就是当前工作目录测试里from mypkg.core.base import ...这样的导入能稳定成立。conftest.py还可以用来统一预置路径但那是另一个话题。Jupyter NotebookNotebook的默认工作目录往往是启动它的地方而且每个Notebook天然是顶层脚本相对导入在这种环境里基本不可用。我自己的做法是Notebook只负责读取数据和展示结果所有业务逻辑都放进包内的模块Notebook里只用from mypkg.utils.helpers import build_message这种绝对导入然后把包目录设置到sys.path或者干脆用可编辑安装。不要把Notebook当成程序入口来组织代码。正式打包分发如果你写的是库而不是一次性脚本建议直接用pip install -e .把项目装进当前虚拟环境。这样项目根目录会被正式注册到site-packages任何工作目录下都能用绝对导入访问到mypkg。可编辑安装-e还保证了源码修改即时生效省去反复pip install的麻烦。这一步做完之后导入问题会少掉一大半。部署服务器服务器上最常见的错误是启动脚本时所在目录和代码目录不一致。比如用systemd启动服务工作目录可能是/那sys.path里根本没有项目根目录。正确的做法是在启动命令前显式cd /path/to/project或者用环境变量PYTHONPATH/path/to/project显式指定。不要指望部署环境跟你本地一样刚好能跑。5. 高频报错排查速查表与我的独家经验5.1 报错→原因→解法对照表把平时最常见的几种导入报错整理成一张表方便你快速定位报错信息典型原因解决方向ImportError: attempted relative import with no known parent package模块被当作顶层脚本运行无父包上下文改用python -m pkg.module运行确保模块在包内被加载ModuleNotFoundError: No module named mypkg项目根目录不在sys.path中或启动目录不对cd到项目根目录设置PYTHONPATHpip install -e .ModuleNotFoundError: No module named core裸模块名找不到脚本所在目录被误当包根包内模块被当成顶层模块不要直接在包目录内运行子模块改用完整的包路径导入ValueError: attempted relative import beyond top-level package相对导入层级超过了顶级包边界比如在顶层包内用了过多的..减少相对层级改用from mypkg.xxx import ...ImportError: cannot import name xxx from yyy目标名字不存在或存在循环导入检查模块里的__all__、拼写与循环依赖关系另外说一句from . import a这种写法在包内是导入同目录的a模块import a在包内则是从sys.path里找顶层模块a。很多人的混淆点在于在包内协同工作时也希望import a能找到同目录文件实际上这两者机制完全不同。规范做法就是包内优先用相对导入外部入口用绝对导入。5.2 三步定位法遇到导包报错不要急着改代码按这三步检查方向基本不会跑偏。第一步确认启动方式。你的代码是被python 某个文件.py拉起来的还是被python -m 某个模块拉起来的前者是裸脚本后者是包内模块。如果启动方式不对一切都是白绕。第二步打印关键变量。在报错模块的最前面临时加上import sys print(__name__ , __name__) print(__package__ , __package__) print(sys.path[:3] , sys.path[:3])运行一次看看三类信息是否和预期一致。__name__不应该是__main__如果你期望它是一个被导入的包内模块__package__应该显示正确的包名sys.path[:3]里应该包含项目根目录。第三步核对项目根目录。如果sys.path里没有项目根目录最简单的方式就是把启动命令的工作目录切到根目录或者export PYTHONPATH/path/to/project。这一步做对了绝大多数ModuleNotFoundError立刻消失。每次排查走完这三步基本上十分钟之内就能确定问题出在哪一层。我是真的靠这套流程救回来不少即将上线的服务。5.3 我的几个习惯最后分享几个多年踩坑后养成的习惯未必是教科书标准答案但绝对实用。习惯一入口文件极简化。main.py永远不会直接写业务逻辑只做两件事导入入口模块、调用入口函数。这样它永远只涉及一层绝对导入不需要复杂包上下文。习惯二包内交叉引用默认相对导入。除非遇到顶层包边界问题否则同包或同级子包之间用from .xxx import或from ..yyy import。好处是代码可搬迁性强改包名时不用全局替换。习惯三测试命令永远用python -m pytest。哪怕是简单的脚本项目也习惯这么敲。它能保证测试环境里sys.path[0]是当前目录排除pytest自动改路径的干扰。习惯四项目变复杂的第一时间就做可编辑安装。不等到踩坑再补救。在项目根目录建好pyproject.tomlpip install -e .之后在任意目录写代码都能稳定导入。习惯五遇到导入问题立刻打印sys.path不靠猜。刚入门时总喜欢反复试各种import写法试来试去最后大概率不是语法问题而是搜索路径问题。打印一次sys.path什么都清楚了。最后说一个我自己坚持了很久的细节但凡项目里出现第二个以上的py文件哪怕只是个小工具我也一定会先搭好包结构然后从根目录用python -m启动。这个习惯帮我省下的排查时间远比多敲几个字符的成本多得多。也希望你读完这篇之后能少走几个我当年走过的弯路。

相关新闻

Vercel 开源 json-render 之后:中文前端社区一周讨论观察

Vercel 开源 json-render 之后:中文前端社区一周讨论观察

Vercel 开源 json-render 之后:中文前端社区一周讨论观察 【免费下载链接】json-render The Generative UI framework 项目地址: https://gitcode.com/GitHub_Trending/js/json-render 2026 年 1 月中旬,Vercel Labs 在 GitHub 上开源了自研的生成…

2026/10/10 8:26:54 阅读更多 →
Java集合框架核心之Map全解:从HashMap到ConcurrentHashMap实践避坑

Java集合框架核心之Map全解:从HashMap到ConcurrentHashMap实践避坑

写Java这几年,我发现自己和同事讨论最多的数据结构就是Map。HashMap、LinkedHashMap、TreeMap、ConcurrentHashMap,随便挑一个出来都能聊出好几个版本的踩坑故事。面试别人时也发现一个规律:很多候选人对Map的理解停留在“HashMap无序、HashT…

2026/10/10 8:26:54 阅读更多 →
美赛绘图完整指南:从绘图框架搭建到O奖级图表技法

美赛绘图完整指南:从绘图框架搭建到O奖级图表技法

每年二月的数学建模赛场,比建模结果更早被翻来覆去看的其实是图。见过不少队伍,模型推得挺漂亮,结论也站得住脚,但翻到绘图页,一眼下去全是默认配色、直角坐标、堆积柱状图堆在一起,评委翻两页就没耐心了。…

2026/10/10 8:26:54 阅读更多 →

最新新闻

「同一套数据」到底是什么:教育 SaaS 里最被含糊的一句话

「同一套数据」到底是什么:教育 SaaS 里最被含糊的一句话

一、先拆这个词 「同一套数据」在教育 SaaS 的销售话术里出现频率很高,但它几乎从没被准确定义过。 在系统设计层面,它指的是一种数据所有权架构:业务实体只有一份权威记录(single source of truth),所有模…

2026/10/10 9:13:53 阅读更多 →
Zed 新技巧:横向滚动

Zed 新技巧:横向滚动

想象一下这个场景:你在 Zed 里打开一个长文件,某一行代码特别长——比如一个嵌套很深的 JSON,或者一个参数列表排了八个字段。你想看这一行右边的部分,怎么办? 在 Windows 和 macOS 上,你可以按住 Shift 然…

2026/10/10 9:13:53 阅读更多 →
初创小微企业轻量化 GEO:预算有限,不用官网也能落地

初创小微企业轻量化 GEO:预算有限,不用官网也能落地

1. 小微企业做 GEO 的资源约束GEO(Generative Engine Optimization,生成式引擎优化)的目标,是让 AI 问答、AI 搜索在回答用户问题时,优先引用你的品牌或内容。很多小微企业一听 GEO 就觉得门槛高,其实真正的…

2026/10/10 9:13:53 阅读更多 →
GEO 常见踩坑清单:9 个会直接导致 AI 拒绝采信内容的错误做法

GEO 常见踩坑清单:9 个会直接导致 AI 拒绝采信内容的错误做法

1. 坑 1:全网实体信息不一致,存在矛盾描述问题表现:企业在官网、百科、社交媒体、第三方平台等渠道展示的名称、地址、联系方式、营业时间、服务范围等信息互相矛盾。AI 在抓取和比对多个信源时,会因无法确认哪个是真实信息而降低…

2026/10/10 9:13:53 阅读更多 →
RocketMQ 事务消息:订单与积分的最终一致

RocketMQ 事务消息:订单与积分的最终一致

RocketMQ 事务消息:订单与积分的最终一致作者:鱼宵 | 实战驱动系列 第 6 篇 完整课程与可运行源码已开源在 Gitee:https://gitee.com/j67mk2/rocketmq-journey (本文对应 lesson-06/)你有没有碰到过这种线…

2026/10/10 9:13:53 阅读更多 →
《Agentic Design Patterns》第 9 章导读:学习与适应(Learning and Adaptation)

《Agentic Design Patterns》第 9 章导读:学习与适应(Learning and Adaptation)

《Agentic Design Patterns》第 9 章导读:学习与适应(Learning and Adaptation)本文是对开源书籍《Agentic Design Patterns》第 9 章的解读与导读,内容忠实呈现原文,并附个人思考。 原书在线阅读:https://…

2026/10/10 9:12:52 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 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/10 5:23:50 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/9 6:17:20 阅读更多 →