<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Python - 标签 - Vindrin</title><link>https://vindrin.top/zh-cn/tags/python/</link><description>Python - 标签 - Vindrin</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><managingEditor>vindrin@outlook.com (Vindrin)</managingEditor><webMaster>vindrin@outlook.com (Vindrin)</webMaster><lastBuildDate>Fri, 10 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://vindrin.top/zh-cn/tags/python/" rel="self" type="application/rss+xml"/><item><title>RSS 阅读 Bot</title><link>https://vindrin.top/zh-cn/project/rss-reader-bot/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>vindrin@outlook.com (Vindrin)</author><guid>https://vindrin.top/zh-cn/project/rss-reader-bot/</guid><description><![CDATA[<h1 id="rss-阅读-bot">RSS 阅读 Bot</h1>
<p>一个 Telegram 机器人，自动拉取你订阅的 RSS 源，每天发送一条摘要消息。</p>
<h2 id="背景">背景</h2>
<p>我关注超过 15 个博客和新闻源，每天手动逐个查看太累了。一个 bot，每天一条消息，搞定。</p>
<h2 id="架构">架构</h2>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">RSS 源 → 解析器 → 去重 → 摘要格式化 → Telegram Bot API</span></span></code></pre></div></div>
<h2 id="核心功能">核心功能</h2>
<ul>
<li>通过 bot 命令添加/删除订阅（<code>/add</code>、<code>/remove</code>、<code>/list</code>）</li>
<li>定时每日推送摘要</li>
<li>标记文章为已读</li>
<li>关键词过滤</li>
</ul>
<h2 id="部署">部署</h2>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pip install feedparser python-telegram-bot apscheduler
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">TELEGRAM_TOKEN</span><span class="o">=</span>your_token_here
</span></span><span class="line"><span class="cl">python bot.py</span></span></code></pre></div></div>
<h2 id="状态">状态</h2>
<p><code>v1.0.0</code> — 已稳定运行 2 个月，无故障。</p>]]></description></item><item><title>终端仪表盘</title><link>https://vindrin.top/zh-cn/project/terminal-dashboard/</link><pubDate>Sat, 28 Mar 2026 00:00:00 +0000</pubDate><author>vindrin@outlook.com (Vindrin)</author><guid>https://vindrin.top/zh-cn/project/terminal-dashboard/</guid><description><![CDATA[<h1 id="终端仪表盘">终端仪表盘</h1>
<p>完全运行在终端里的实时系统监控工具。</p>
<h2 id="为什么是终端">为什么是终端？</h2>
<p>有时候 SSH 进一台没有 GUI 的机器，需要查看 CPU、内存、磁盘和网络状态，却不想安装笨重的监控软件，终端仪表盘就是答案。</p>
<h2 id="用到的库">用到的库</h2>
<ul>
<li><strong>Textual</strong> — TUI 框架</li>
<li><strong>psutil</strong> — 系统指标采集</li>
<li><strong>rich</strong> — 漂亮的表格和图表</li>
</ul>
<h2 id="界面预览ascii">界面预览（ASCII）</h2>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">┌── CPU ──────────────────┐  ┌── 内存 ──────────────────┐
</span></span><span class="line"><span class="cl">│ 核心 0  ████░░░░  42%   │  │ 已用  6.2GB / 16GB  38% │
</span></span><span class="line"><span class="cl">│ 核心 1  ██░░░░░░  21%   │  │ 交换  0.1GB / 4GB    2% │
</span></span><span class="line"><span class="cl">└─────────────────────────┘  └──────────────────────────┘
</span></span><span class="line"><span class="cl">┌── 磁盘 ─────────────────────────────────────────────────┐
</span></span><span class="line"><span class="cl">│ C:\     80GB / 250GB  32%  ██████░░░░░░░░░░░░░░░░░░░░ │
</span></span><span class="line"><span class="cl">│ D:\    167GB / 250GB  67%  ██████████████░░░░░░░░░░░░ │
</span></span><span class="line"><span class="cl">└─────────────────────────────────────────────────────────┘</span></span></code></pre></div></div>
<h2 id="状态">状态</h2>
<p><code>v0.1.0</code> — 功能完整，样式待打磨。</p>]]></description></item><item><title>Markdown 笔记同步 CLI 工具</title><link>https://vindrin.top/zh-cn/project/markdown-note-sync/</link><pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate><author>vindrin@outlook.com (Vindrin)</author><guid>https://vindrin.top/zh-cn/project/markdown-note-sync/</guid><description><![CDATA[<h1 id="markdown-笔记同步-cli-工具">Markdown 笔记同步 CLI 工具</h1>
<p>用 Markdown 记笔记，随处同步，不依赖任何专有格式。</p>
<h2 id="问题背景">问题背景</h2>
<p>我在多台机器上用 Markdown 记笔记，想要比 Obsidian Sync 更简单的方案——只需要一个 CLI 工具，能 diff 并推送变更就够了。</p>
<h2 id="命令示例">命令示例</h2>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 初始化同步配置</span>
</span></span><span class="line"><span class="cl">mnotes init --remote user@server:/notes
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 双向同步</span>
</span></span><span class="line"><span class="cl">mnotes sync
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 同步前预览差异</span>
</span></span><span class="line"><span class="cl">mnotes diff</span></span></code></pre></div></div>
<h2 id="工作原理">工作原理</h2>
<ol>
<li>对本地所有 <code>.md</code> 文件计算哈希值</li>
<li>与远程哈希索引比对</li>
<li>推送新增/修改的文件，拉取远程独有的文件</li>
<li>冲突处理：两份都保留，附加时间戳后缀</li>
</ol>
<h2 id="依赖">依赖</h2>
<ul>
<li><code>paramiko</code> — SSH 连接</li>
<li><code>watchdog</code> — 可选，文件变更时自动同步</li>
</ul>
<h2 id="状态">状态</h2>
<p><code>v0.2.1</code> — 双机同步稳定版。三端同步是未来计划。</p>]]></description></item><item><title>本地 AI 图像分类器</title><link>https://vindrin.top/zh-cn/project/ai-image-classifier/</link><pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate><author>vindrin@outlook.com (Vindrin)</author><guid>https://vindrin.top/zh-cn/project/ai-image-classifier/</guid><description><![CDATA[<h1 id="本地-ai-图像分类器">本地 AI 图像分类器</h1>
<p>用文字描述来分类图片，完全本地运行，不依赖任何云 API。</p>
<h2 id="原理">原理</h2>
<p>使用 <strong>OpenAI CLIP</strong> 计算图片与一组文字标签之间的相似度，得分最高的标签即为分类结果。</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-python">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">PIL</span> <span class="kn">import</span> <span class="n">Image</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">clip</span><span class="o">,</span> <span class="nn">torch</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">model</span><span class="p">,</span> <span class="n">preprocess</span> <span class="o">=</span> <span class="n">clip</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="s2">&#34;ViT-B/32&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">image</span> <span class="o">=</span> <span class="n">preprocess</span><span class="p">(</span><span class="n">Image</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">&#34;photo.jpg&#34;</span><span class="p">))</span><span class="o">.</span><span class="n">unsqueeze</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">labels</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;a cat&#34;</span><span class="p">,</span> <span class="s2">&#34;a dog&#34;</span><span class="p">,</span> <span class="s2">&#34;a car&#34;</span><span class="p">,</span> <span class="s2">&#34;a tree&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">text</span> <span class="o">=</span> <span class="n">clip</span><span class="o">.</span><span class="n">tokenize</span><span class="p">(</span><span class="n">labels</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">with</span> <span class="n">torch</span><span class="o">.</span><span class="n">no_grad</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">logits</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">model</span><span class="p">(</span><span class="n">image</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">probs</span> <span class="o">=</span> <span class="n">logits</span><span class="o">.</span><span class="n">softmax</span><span class="p">(</span><span class="n">dim</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">best</span> <span class="o">=</span> <span class="n">labels</span><span class="p">[</span><span class="n">probs</span><span class="o">.</span><span class="n">argmax</span><span class="p">()]</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;预测结果：</span><span class="si">{</span><span class="n">best</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span></span></span></code></pre></div></div>
<h2 id="界面">界面</h2>
<p>基于 Flask 的 Web UI，拖入图片，输入标签，立即得到分类结果。</p>
<h2 id="状态">状态</h2>
<p><code>v0.1.0</code> — 概念验证版。CPU 可运行，大批量图片较慢。</p>]]></description></item><item><title>Python 虚拟环境详解</title><link>https://vindrin.top/zh-cn/posts/python-venv-guide/</link><pubDate>Tue, 03 Feb 2026 00:00:00 +0000</pubDate><author>vindrin@outlook.com (Vindrin)</author><guid>https://vindrin.top/zh-cn/posts/python-venv-guide/</guid><description><![CDATA[<h1 id="python-虚拟环境详解">Python 虚拟环境详解</h1>
<p>如果你曾经因为全局升级某个包把项目搞崩了，那你就需要虚拟环境了。</p>
<h2 id="什么是虚拟环境">什么是虚拟环境？</h2>
<p>虚拟环境是一个隔离的 Python 安装——它有自己独立的 <code>pip</code> 和包，完全和系统 Python 分开。</p>
<h2 id="创建虚拟环境">创建虚拟环境</h2>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python -m venv .venv
</span></span><span class="line"><span class="cl"><span class="nb">source</span> .venv/bin/activate    <span class="c1"># Linux/macOS</span>
</span></span><span class="line"><span class="cl">.venv<span class="se">\S</span>cripts<span class="se">\a</span>ctivate       <span class="c1"># Windows</span></span></span></code></pre></div></div>
<h2 id="安装包">安装包</h2>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pip install requests numpy pandas
</span></span><span class="line"><span class="cl">pip freeze &gt; requirements.txt</span></span></code></pre></div></div>
<h2 id="在别处恢复">在别处恢复</h2>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python -m venv .venv
</span></span><span class="line"><span class="cl">pip install -r requirements.txt</span></span></code></pre></div></div>
<h2 id="配合-conda-使用">配合 conda 使用</h2>
<p>如果你用 conda，<code>conda create -n myenv python=3.11</code> 也是同样的隔离效果。</p>]]></description></item><item><title>Conda 环境速查手册</title><link>https://vindrin.top/zh-cn/docs/conda-cheatsheet/</link><pubDate>Tue, 20 Jan 2026 00:00:00 +0000</pubDate><author>vindrin@outlook.com (Vindrin)</author><guid>https://vindrin.top/zh-cn/docs/conda-cheatsheet/</guid><description><![CDATA[<h1 id="conda-环境速查手册">Conda 环境速查手册</h1>
<p>日常管理 conda 环境所需要的一切。</p>
<h2 id="创建与激活">创建与激活</h2>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">conda create -n myenv <span class="nv">python</span><span class="o">=</span>3.11
</span></span><span class="line"><span class="cl">conda activate myenv
</span></span><span class="line"><span class="cl">conda deactivate</span></span></code></pre></div></div>
<h2 id="安装包">安装包</h2>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">conda install numpy pandas matplotlib
</span></span><span class="line"><span class="cl">conda install -c conda-forge some-package
</span></span><span class="line"><span class="cl">pip install package-not-in-conda        <span class="c1"># 备用方案</span></span></span></code></pre></div></div>
<h2 id="管理环境">管理环境</h2>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">conda env list                          <span class="c1"># 列出所有环境</span>
</span></span><span class="line"><span class="cl">conda info --envs                       <span class="c1"># 同上，更多细节</span>
</span></span><span class="line"><span class="cl">conda remove -n myenv --all             <span class="c1"># 删除环境</span>
</span></span><span class="line"><span class="cl">conda rename -n oldname newname         <span class="c1"># 重命名（conda 23.x+）</span></span></span></code></pre></div></div>
<h2 id="导出与复现">导出与复现</h2>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 导出（含 conda 和 pip 包）</span>
</span></span><span class="line"><span class="cl">conda env <span class="nb">export</span> &gt; environment.yml
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 在其他机器上复现</span>
</span></span><span class="line"><span class="cl">conda env create -f environment.yml</span></span></code></pre></div></div>
<h2 id="更新">更新</h2>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">conda update conda                      <span class="c1"># 更新 conda 本身</span>
</span></span><span class="line"><span class="cl">conda update --all                      <span class="c1"># 更新所有包</span></span></span></code></pre></div></div>
<h2 id="小技巧">小技巧</h2>
<p>把 <code>conda-forge</code> 设为默认频道，获取更多包：</p>]]></description></item><item><title>GitPush Manager</title><link>https://vindrin.top/zh-cn/project/gitpush-manager/</link><pubDate>Wed, 10 Sep 2025 00:00:00 +0000</pubDate><author>vindrin@outlook.com (Vindrin)</author><guid>https://vindrin.top/zh-cn/project/gitpush-manager/</guid><description><![CDATA[<h1 id="gitpush-manager">GitPush Manager</h1>
<p>用 <strong>pywebview + Flask</strong> 构建的轻量桌面应用，把常用的 Git 操作变成一个可视化界面。</p>
<h2 id="动机">动机</h2>
<p>每天重复敲同样的三条 Git 命令几十次，这个工具把它们变成一次点击。</p>
<h2 id="功能">功能</h2>
<ul>
<li>一个界面完成暂存、提交、推送</li>
<li>多仓库管理</li>
<li>提交信息模板</li>
<li>推送历史日志</li>
</ul>
<h2 id="技术栈">技术栈</h2>
<ul>
<li><strong>后端</strong>：Python + Flask</li>
<li><strong>前端</strong>：HTML/CSS/JS via pywebview</li>
<li><strong>打包</strong>：PyInstaller</li>
</ul>
<h2 id="状态">状态</h2>
<p><code>v0.3.0</code> — 个人使用稳定版。多仓库支持进行中。</p>]]></description></item></channel></rss>