<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Python on 魔都水滴</title>
    <link>https://blog.margrop.net/tag/python/</link>
    <description>Recent content in Python on 魔都水滴</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-CN</language>
    <lastBuildDate>Sat, 11 Jul 2026 08:30:00 +0800</lastBuildDate>
    <atom:link href="https://blog.margrop.net/tag/python/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>密码没写错，群晖却不让登录？我拆开 DSM 的 RSA &#43; AES 双层信封，完整复刻 WebAPI 登录</title>
      <link>https://blog.margrop.net/post/synology-webapi-login-encryption-deep-dive/</link>
      <pubDate>Sat, 11 Jul 2026 08:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/synology-webapi-login-encryption-deep-dive/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;群晖某些 WebAPI 登录请求并不是简单地把 &lt;code&gt;account&lt;/code&gt; 和 &lt;code&gt;passwd&lt;/code&gt; 直接提交给 &lt;code&gt;auth.cgi&lt;/code&gt;。OpenStack Cinder 的 Synology 驱动展示了一套完整兼容流程：先调用 &lt;code&gt;SYNO.API.Encryption.getinfo&lt;/code&gt;，取得 RSA 公钥、服务器时间和两个动态字段名；客户端生成一次性随机 passphrase，用 RSA 加密它，再用它派生 AES-256-CBC 的密钥和 IV，对 URL 编码后的登录参数加密，最后把两段 Base64 密文放入服务器指定的 &lt;code&gt;cipherkey&lt;/code&gt; 字段。&lt;/p&gt;&#xA;&lt;p&gt;但必须先划清边界：这是一种 &lt;strong&gt;WebAPI 身份认证兼容方式&lt;/strong&gt;，不是破解密码，也不是绕过权限；拿到 &lt;code&gt;session=DSM&lt;/code&gt; 的 API SID，也不等于凭空获得浏览器 DSM 管理页面的完整 Cookie 登录状态。HTTP 参数加密同样不能代替 HTTPS，因为 TLS 还负责服务器身份校验、完整性保护和抵抗中间人攻击。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;原创题图：RSA 与 AES 双层信封保护 NAS 登录&#34; src=&#34;https://blog.margrop.net/post-images/synology-webapi-login-encryption-deep-dive/00-cover-original.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ubuntu 关机要等 90 秒?Python asyncio 服务不肯接 SIGTERM 的排查与修复</title>
      <link>https://blog.margrop.net/post/ubuntu-shutdown-stuck/</link>
      <pubDate>Fri, 19 Jun 2026 10:58:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/ubuntu-shutdown-stuck/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这台升级到 24.04 的代理机,关机变成了一件折磨人的事:&lt;code&gt;systemctl reboot&lt;/code&gt; 之后,SSH 不掉、灯不灭,要干等 &lt;strong&gt;90 秒&lt;/strong&gt; 才进入真正的 shutdown 流程。journalctl 里很明确:&lt;code&gt;smart-proxy.service: State &#39;stop-sigterm&#39; timed out. Killing.&lt;/code&gt;——systemd 给了 SIGTERM,等 90 秒没人响应,只能 SIGKILL 强杀。&lt;/p&gt;&#xA;&lt;p&gt;根因不是 systemd 的错,也不是 Ubuntu 的错,是 &lt;strong&gt;Python 的 asyncio 服务在收到 SIGTERM 后,没有真正去结束它的子任务&lt;/strong&gt;——它正卡在某个 &lt;code&gt;socket.recv&lt;/code&gt; 上,Python 解释器根本不主动去看&amp;quot;有人叫我走&amp;quot;。&lt;/p&gt;&#xA;&lt;p&gt;修复分两步,缺一不可:&lt;strong&gt;(1)&lt;/strong&gt; 给两个 Python unit 写 systemd drop-in,把 &lt;code&gt;TimeoutStopSec&lt;/code&gt; 从默认的 90s 缩到 20s;&lt;strong&gt;(2)&lt;/strong&gt; 在 Python 服务里主动遍历 &lt;code&gt;asyncio.all_tasks()&lt;/code&gt;,收到 SIGTERM 后把所有 in-flight 的 handler &lt;code&gt;cancel()&lt;/code&gt; 掉,再用 &lt;code&gt;asyncio.wait_for(self.stop(), timeout=10)&lt;/code&gt; 包一层做兜底。改完之后,同样一次 &lt;code&gt;reboot&lt;/code&gt;,从 90 秒掉到 1 秒。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>macOS LaunchAgent 里的 Python 程序连不上外网？一文搞懂 httpx 代理陷阱的完整排查与修复</title>
      <link>https://blog.margrop.net/post/macos-launchagent-python-httpx-proxy-no-route-to-host/</link>
      <pubDate>Sat, 30 May 2026 09:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/macos-launchagent-python-httpx-proxy-no-route-to-host/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;macOS 的 LaunchAgent 环境下，Python httpx 库会自动读取系统代理设置（&lt;code&gt;scutil --proxy&lt;/code&gt;），但 LaunchAgent 进程可能根本无法访问该代理服务器——于是请求静默失败，报错 &lt;code&gt;All connection attempts failed&lt;/code&gt; 或 &lt;code&gt;No route to host&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;解决方案只需要一行：在 LaunchAgent 的 plist 文件中添加 &lt;code&gt;NO_PROXY=*&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;这篇文章记录了我从发现 AI Agent 企业微信消息不回复、到逐步排查代理问题、最终定位到 macOS 系统代理与 LaunchAgent 网络隔离的完整过程。涉及 Python httpx 源码分析、macOS 代理机制深度解析、以及 LaunchAgent 运行环境的诸多坑点。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>从零开始的 AI Agent 完整迁移实战：踩坑九九八十一难后的通关攻略</title>
      <link>https://blog.margrop.net/post/ai-agent-complete-migration-guide-from-scratch/</link>
      <pubDate>Sat, 30 May 2026 08:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/ai-agent-complete-migration-guide-from-scratch/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;从一个 AI Agent 平台迁移到另一个平台，听起来像是「复制粘贴」的事情，实际上却是一场涉及数据迁移、渠道对接、定时任务、自动启动、代理配置、模块兼容性的系统工程。&lt;/p&gt;&#xA;&lt;p&gt;这篇文章记录了我从零开始完成一次 AI Agent 完整迁移的全过程：从安装新平台、迁移记忆和技能、配置消息渠道、排查各种诡异问题，到最终实现全自动运行。涉及 9 个踩坑点和对应的解决方案，希望能帮到有类似需求的朋友。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Clawd Code 架构速读版：用一页纸看懂 Python-first 重写工作区</title>
      <link>https://blog.margrop.net/post/clawd-code-architecture-quick-read/</link>
      <pubDate>Tue, 31 Mar 2026 21:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/clawd-code-architecture-quick-read/</guid>
      <description>&lt;p&gt;&lt;code&gt;margrop/clawd-code&lt;/code&gt; 的最新代码，已经不是“把泄露源码原样存起来”的那种仓库了。它现在是一个很明确的 &lt;strong&gt;Python-first porting workspace&lt;/strong&gt;：&lt;code&gt;src/&lt;/code&gt; 是活动实现，&lt;code&gt;tests/&lt;/code&gt; 负责验证，&lt;code&gt;archive/claude_code_ts_snapshot/&lt;/code&gt; 只是可选的本地归档，&lt;code&gt;src/reference_data/&lt;/code&gt; 才是命令和工具镜像的来源。&lt;/p&gt;&#xA;&lt;p&gt;如果上一版长文讲的是“怎么读源码”，这一版速读版只回答一个问题：&lt;strong&gt;这个工作区到底怎么分层？&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blog.margrop.net/post-images/clawd-code-quick-overview.svg&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Clawd Code 最新代码解析：一个 Python-first 的 Claude Code 重写工作区如何组织命令、工具、会话与审计</title>
      <link>https://blog.margrop.net/post/claude-code-daofa-tishu-source-code-analysis/</link>
      <pubDate>Tue, 31 Mar 2026 20:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/claude-code-daofa-tishu-source-code-analysis/</guid>
      <description>&lt;p&gt;我重新看了 &lt;code&gt;margrop/clawd-code&lt;/code&gt; 的最新代码之后，得出的第一印象是：这仓库已经不再是“泄露源码镜像”的延续叙事了，而是一个明确的 &lt;strong&gt;Python-first porting workspace&lt;/strong&gt;。它的 tracked tree 里，&lt;code&gt;src/&lt;/code&gt; 是活动实现，&lt;code&gt;tests/&lt;/code&gt; 是验证层，&lt;code&gt;archive/claude_code_ts_snapshot/&lt;/code&gt; 是可选的本地归档，&lt;code&gt;src/reference_data/&lt;/code&gt; 则保存了命令、工具和表面覆盖率的镜像数据。&lt;/p&gt;&#xA;&lt;p&gt;这意味着项目关注点变了。它不再只问“原始 Claude Code 是怎么写的”，而是问：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;旧系统的结构能不能被重新组织成更清晰的 Python 工程；&lt;/li&gt;&#xA;&lt;li&gt;命令、工具、会话、权限和启动顺序能不能被显式建模；&lt;/li&gt;&#xA;&lt;li&gt;当前 porting workspace 到底覆盖到了旧体系的哪些边界；&lt;/li&gt;&#xA;&lt;li&gt;哪些部分只是镜像，哪些部分还只是骨架，哪些部分已经能跑出可读的 runtime 报告。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;从这个角度看，这个仓库更像一套“重建中的工程系统”，而不是“保存原样的源码档案”。这也是我把这篇文章重新更新的原因。上一版文章仍然围绕旧快照本体，这一版必须围绕最新的 Python porting 工作区本身来写。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blog.margrop.net/post-images/clawd-code-architecture-2026.svg&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>天翼云电脑永不休眠方法高科技版本（基于Python）</title>
      <link>https://blog.margrop.net/post/automating-connections-to-ctyun-desktop-using-python/</link>
      <pubDate>Tue, 18 Jun 2024 17:41:35 +0800</pubDate>
      <guid>https://blog.margrop.net/post/automating-connections-to-ctyun-desktop-using-python/</guid>
      <description>&lt;h4 id=&#34;原理定期连接天翼云桌面需小于1小时间隔&#34;&gt;原理：定期连接天翼云桌面（需小于1小时间隔）&lt;/h4&gt;&#xA;&lt;h5 id=&#34;步骤一获取请求数据&#34;&gt;步骤一：获取请求数据&lt;/h5&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;打开Chrome浏览器的开发者工具&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;在Chrome浏览器中按&lt;code&gt;F12&lt;/code&gt;或右键选择&lt;code&gt;检查&lt;/code&gt;打开开发者工具。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;访问并登录天翼云桌面&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;访问&lt;code&gt;https://pc.ctyun.cn&lt;/code&gt;，并使用你的账号登录云电脑。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;复制connect请求的curl命令&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;在开发者工具中，选择&lt;code&gt;Network&lt;/code&gt;标签，找到并点击名为&lt;code&gt;connect&lt;/code&gt;的请求。&lt;/li&gt;&#xA;&lt;li&gt;右键点击该请求，选择&lt;code&gt;Copy as cURL (cmd)&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;获取localStorage中的authData&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;在开发者工具中，选择&lt;code&gt;Application&lt;/code&gt;标签。&lt;/li&gt;&#xA;&lt;li&gt;在左侧栏中找到&lt;code&gt;Local Storage&lt;/code&gt;并选择&lt;code&gt;https://pc.ctyun.cn&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;li&gt;找到&lt;code&gt;authData&lt;/code&gt;键，复制其对应的值。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>CentOS 7下，pip install -upgrade pip 导致 pip 无法使用的问题 ImportError: No module named typing</title>
      <link>https://blog.margrop.net/post/centos-7-no-module-named-typing-after-upgrade-pip/</link>
      <pubDate>Wed, 16 Jun 2021 11:13:46 +0800</pubDate>
      <guid>https://blog.margrop.net/post/centos-7-no-module-named-typing-after-upgrade-pip/</guid>
      <description>&lt;h1 id=&#34;问题现象&#34;&gt;问题现象&lt;/h1&gt;&#xA;&lt;p&gt;pip安装某第三方 SDK，提示升级 pip，按提示升级 pip 后报错&lt;/p&gt;&#xA;&lt;h2 id=&#34;导致报错的-pip-升级命令&#34;&gt;导致报错的 pip 升级命令&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install --upgrade pip&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;pip-错误提示&#34;&gt;pip 错误提示&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Traceback &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;most recent call last&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/usr/bin/pip&amp;#34;&lt;/span&gt;, line 9, in &amp;lt;module&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    load_entry_point&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pip==21.1.2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;console_scripts&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pip&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/usr/lib/python2.7/site-packages/pkg_resources.py&amp;#34;&lt;/span&gt;, line 378, in load_entry_point&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; get_distribution&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;dist&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;.load_entry_point&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;group, name&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/usr/lib/python2.7/site-packages/pkg_resources.py&amp;#34;&lt;/span&gt;, line 2566, in load_entry_point&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; ep.load&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/usr/lib/python2.7/site-packages/pkg_resources.py&amp;#34;&lt;/span&gt;, line 2260, in load&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    entry &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; __import__&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;self.module_name, globals&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt;,globals&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;__name__&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/usr/lib/python2.7/site-packages/pip/__init__.py&amp;#34;&lt;/span&gt;, line 1, in &amp;lt;module&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    from typing import List, Optional&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ImportError: No module named typing&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Python3面向对象编程</title>
      <link>https://blog.margrop.net/post/python3-oop/</link>
      <pubDate>Thu, 04 Mar 2021 22:23:55 +0800</pubDate>
      <guid>https://blog.margrop.net/post/python3-oop/</guid>
      <description>&lt;h1 id=&#34;面向对象编程&#34;&gt;面向对象编程&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Student&lt;/span&gt;(object):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; __init__(self, name, score):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;score &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; score&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;print_score&lt;/span&gt;(self):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; (self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;name, self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;score))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Python3 IO编程</title>
      <link>https://blog.margrop.net/post/python3-io-programming/</link>
      <pubDate>Fri, 26 Feb 2021 10:29:31 +0800</pubDate>
      <guid>https://blog.margrop.net/post/python3-io-programming/</guid>
      <description>&lt;h1 id=&#34;文件读写&#34;&gt;文件读写&lt;/h1&gt;&#xA;&lt;h2 id=&#34;读文件read会一次性读取全部内容&#34;&gt;读文件：read()会一次性读取全部内容&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;with 和 try&amp;hellip;catch一样，更简介，自动调用close方法&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;with&lt;/span&gt; open(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/path/to/file&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;r&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; f:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(f&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;read())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>如何在Mac上执行一行命令，同时运行多个Python脚本？</title>
      <link>https://blog.margrop.net/post/one-command-in-mac-execute-mulit-python-scripts/</link>
      <pubDate>Thu, 25 Feb 2021 15:52:15 +0800</pubDate>
      <guid>https://blog.margrop.net/post/one-command-in-mac-execute-mulit-python-scripts/</guid>
      <description>&lt;p&gt;目前有4个Python脚本，打算使用一条命令，同时执行这4个脚本，如何操作呢？&#xA;我目前采用的办法比较简陋，使用了5个shell脚本来实现，不知道还有没有更好的方法。&lt;/p&gt;&#xA;&lt;h1 id=&#34;shell脚本runallsh&#34;&gt;shell脚本runAll.sh&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;ls&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open -a Terminal.app run17688821.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open -a Terminal.app run49763693.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open -a Terminal.app run857413.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open -a Terminal.app run856853.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Python3正则表达式</title>
      <link>https://blog.margrop.net/post/python3-zheng-ze-biao-da-shi/</link>
      <pubDate>Wed, 24 Feb 2021 08:38:22 +0800</pubDate>
      <guid>https://blog.margrop.net/post/python3-zheng-ze-biao-da-shi/</guid>
      <description>&lt;h1 id=&#34;re模块&#34;&gt;re模块&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;s &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ABC\-001&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# Python的字符串&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 对应的正则表达式字符串不变：&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# &amp;#39;ABC\-001&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;判断正则表达式是否匹配&#34;&gt;判断正则表达式是否匹配&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; re&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; re&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;match&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;^\d&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{3}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;\-\d{3,8}$&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;010-12345&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;_sre&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;SRE_Match object; span&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt;), &lt;span style=&#34;color:#66d9ef&#34;&gt;match&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;010-12345&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; re&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;match&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;^\d&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{3}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;\-\d{3,8}$&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;010 12345&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Python3常用内建模块-HTMLParser</title>
      <link>https://blog.margrop.net/post/python3-htmlparser/</link>
      <pubDate>Mon, 15 Feb 2021 11:07:02 +0800</pubDate>
      <guid>https://blog.margrop.net/post/python3-htmlparser/</guid>
      <description>&lt;h1 id=&#34;htmlparser&#34;&gt;HTMLParser&lt;/h1&gt;</description>
    </item>
    <item>
      <title>Python3常用字符串操作</title>
      <link>https://blog.margrop.net/post/python-string-opeation/</link>
      <pubDate>Sun, 14 Feb 2021 22:33:22 +0800</pubDate>
      <guid>https://blog.margrop.net/post/python-string-opeation/</guid>
      <description>&lt;h1 id=&#34;python-print&#34;&gt;python print&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;不换行（在后面加上,end=&amp;rsquo;&amp;rsquo;）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;print(string,end=&amp;#39;&amp;#39;) &#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Python3基础</title>
      <link>https://blog.margrop.net/post/python3-basic-learning/</link>
      <pubDate>Fri, 12 Feb 2021 14:28:13 +0800</pubDate>
      <guid>https://blog.margrop.net/post/python3-basic-learning/</guid>
      <description>&lt;h1 id=&#34;python3教程&#34;&gt;Python3教程&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000&#34;&gt;http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;python下载&#34;&gt;Python下载&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.python.org/ftp/python/&#34;&gt;https://www.python.org/ftp/python/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;python3-内置函数&#34;&gt;Python3 内置函数&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://docs.python.org/3/library/functions.html&#34;&gt;https://docs.python.org/3/library/functions.html&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python3的Web环境，含第三方以及自建</title>
      <link>https://blog.margrop.net/post/python3-web-runtime-environment/</link>
      <pubDate>Sun, 24 Jan 2021 13:07:30 +0800</pubDate>
      <guid>https://blog.margrop.net/post/python3-web-runtime-environment/</guid>
      <description>&lt;p&gt;之前因为某件家事，需要使用&lt;code&gt;Python3&lt;/code&gt;的Web环境，于是收集了一下。&#xA;第三方网站的环境使用起来很简单，但缺点也很明显，不能保存上次的&lt;code&gt;Python&lt;/code&gt;代码。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
