<?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 Trim21&#39;s Blog</title>
    <link>https://blog.trim21.me/tags/python/</link>
    <description>Recent content in python on Trim21&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Tue, 11 Mar 2025 02:31:16 +0800</lastBuildDate>
    <atom:link href="https://blog.trim21.me/tags/python/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>用pyenv安装python</title>
      <link>https://blog.trim21.me/2019/12/pyenv-build-python/</link>
      <pubDate>Mon, 23 Dec 2019 00:00:00 +0800</pubDate>
      <guid>https://blog.trim21.me/2019/12/pyenv-build-python/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/pyenv/pyenv&#34;&gt;pyenv&lt;/a&gt;是用来安装多个版本的 python&lt;/p&gt;&#xA;&lt;p&gt;官方提供了安装脚本&lt;/p&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl https://cdn.jsdelivr.net/gh/pyenv/pyenv-installer/bin/pyenv-installer | bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(用 jsdeliver 是因为 raw.githubusercontent.com 现在访问不通了)&lt;/p&gt;&#xA;&lt;p&gt;启用 cache，用于缓存下载的 python 源代码:&lt;/p&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p .pyenv/cache&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用 ccache, 可以缓存编译中产生的中间文件，不是必需，但是在多次构建统一版本的 python 时可以有效加速。&lt;/p&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/yyuu/pyenv-ccache.git $(pyenv root)/plugins/pyenv-ccache&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install ccache&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装过程中会出现的错误&lt;/p&gt;&#xA;&lt;p&gt;zipimport.ZipImportError: can&amp;rsquo;t decompress data; zlib not available&lt;/p&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install zlib1g-dev&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?&lt;/p&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install libbz2-dev&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?&lt;/p&gt;</description>
    </item>
    <item>
      <title>给win10应用商店设置代理</title>
      <link>https://blog.trim21.me/2019/06/set-proxy-for-win10-store/</link>
      <pubDate>Wed, 26 Jun 2019 21:32:31 +0800</pubDate>
      <guid>https://blog.trim21.me/2019/06/set-proxy-for-win10-store/</guid>
      <description>&lt;p&gt;最近网络状况实在是不好,用 win10 应用商店下载应用怎么也不成功.修改系统代理也不管用.&#xA;参照&lt;a href=&#34;https://sspai.com/post/41137&#34;&gt;少数派的这篇文章&lt;/a&gt;设置了代理,总算是解决了问题.&lt;/p&gt;&#xA;&lt;p&gt;其中,最麻烦的是找到对应 uwp 应用的 sid,因为是要在表里一项一项的去找.&lt;/p&gt;&#xA;&lt;p&gt;win10 商店对应的应用在注册表中的&lt;code&gt;DisplayName&lt;/code&gt;是&lt;code&gt;Microsoft.WindowsStore&lt;/code&gt;,&#xA;所以遍历&lt;code&gt;HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Mappings&lt;/code&gt;的所有子 key,找到对应&lt;code&gt;DisplayName&lt;/code&gt;中包含&lt;code&gt;Microsoft.WindowsStore&lt;/code&gt;的一项就可以了.&lt;/p&gt;&#xA;&lt;p&gt;因为手动一项一项的去找效率实在是太低,就直接写了个 python 脚本来遍历.&lt;/p&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; winreg&#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;&#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;iterkeys&lt;/span&gt;(key):&#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:#66d9ef&#34;&gt;try&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;while&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&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;# EnumValue方法用来枚举键值，EnumKey用来枚举子键&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;yield&lt;/span&gt; winreg&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;EnumKey(key, i)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            i &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;except&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;WindowsError&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;return&lt;/span&gt;&#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;&#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;itervalues&lt;/span&gt;(key):&#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;    d &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;    &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;while&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&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;# EnumValue方法用来枚举键值，EnumKey用来枚举子键&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            name, value, _ &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; winreg&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;EnumValue(key, i)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            d[name] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; value&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            i &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;except&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;WindowsError&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;return&lt;/span&gt; d&#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;&#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;main&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    base_key &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;        &lt;span style=&#34;color:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Software\Classes\Local Settings\Software&amp;#34;&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:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\Microsoft\Windows\CurrentVersion\AppContainer\Mappings&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#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;    mappings &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; winreg&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;OpenKey(winreg&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;HKEY_CURRENT_USER, base_key)&#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;for&lt;/span&gt; key &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; iterkeys(mappings):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        k &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; winreg&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;OpenKey(winreg&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;HKEY_CURRENT_USER, base_key &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; key)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        info &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; itervalues(k)&#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;if&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;WindowsStore&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; info[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;DisplayName&amp;#39;&lt;/span&gt;]:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            print(info[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;DisplayName&amp;#39;&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            print(key)&#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;break&lt;/span&gt;&#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;&#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;if&lt;/span&gt; __name__ &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    main()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;直接保存成 py 文件,然后运行,控制台的第二行会输出类似&lt;code&gt;S-1-15-2-****&lt;/code&gt;的一个 SID,就是在&lt;code&gt;CheckNetIsolation.exe loopbackexempt -a -p=${SID}&lt;/code&gt;中要用到的 SID.&lt;/p&gt;</description>
    </item>
    <item>
      <title>用PyInstaller打包python应用</title>
      <link>https://blog.trim21.me/2019/06/build-python-package-with-pyinstaller/</link>
      <pubDate>Sun, 02 Jun 2019 23:47:34 +0800</pubDate>
      <guid>https://blog.trim21.me/2019/06/build-python-package-with-pyinstaller/</guid>
      <description>&lt;p&gt;那天突然好奇，&lt;code&gt;docker-compose&lt;/code&gt;是用什么语言写的。然后一看，发现居然是用 python2 写的。&lt;/p&gt;&#xA;&lt;p&gt;但想到我安装的时候从来没在乎过机器上有没有安装 python，或者我的 python 版本是多少，而是按照官网的文档，直接下载一个二进制文件来安装的。突然眼前一亮。看了一下对应的构建代码，发现他是用&lt;a href=&#34;https://github.com/pyinstaller/pyinstaller&#34;&gt;&lt;code&gt;PyInstaller&lt;/code&gt;&lt;/a&gt;来进行打包的，把一个 python 应用打包成单个的二进制文件。&lt;/p&gt;&#xA;&lt;p&gt;一般来说，正常的 python 包的分发会基于 pip 的，发布到 pypi 和用户下载的都是代码文件（和其他语言编译的二进制文件），如果依赖于其他的 package 会在安装的时候再进行下载。&lt;/p&gt;&#xA;&lt;p&gt;但用&lt;code&gt;PyInstaller&lt;/code&gt;，打包出来的可执行文件中包含了所有用到的依赖和 python 解释器，并不需要本机安装了 python 或者 pip，像 docker-compose 这样的工具，打包之后成一个单文件，对于用户在安装和使用的时候都会方便许多，而对于我们开发者来说，就不用考虑兼容旧的 python 版本，可以直接使用 python3.6 的新语法如 type annotation 等，使用某些只有 python3.6 以上版本才能用的依赖库，自然也比原来爽了许多。&lt;/p&gt;&#xA;&lt;p&gt;首先，PyInstaller 的工作原理是从一个 py 文件出发在静态分析出所有用到的依赖，然后把所有的依赖打包起来，在用户使用二进制的时候释放到一个临时文件夹中，用 Python 解释器来运行。&lt;/p&gt;&#xA;&lt;p&gt;PyInstaller 入门的文章已经有很多了，就不再重复写一遍了，主要遇到的坑有这么几个。&lt;/p&gt;&#xA;&lt;h2 id=&#34;用到的非-py-文件要手动指定路径一起打包&#34;&gt;用到的非 py 文件要手动指定路径一起打包&lt;/h2&gt;&#xA;&lt;p&gt;我的程序中用到了一些模板文件，是在程序运行起来之后才根据需要加载决定是否渲染的。这些文件因为不是 python 文件，所以 PyInstaller 在分析的时候也不会知道是程序的一部分，就不会打包在二进制中。&lt;/p&gt;&#xA;&lt;p&gt;在程序运行的时候，如果用到了对应的文件，因为没有被打包进来的缘故，程序就会报错。&lt;/p&gt;&#xA;&lt;p&gt;如果用命令行来指定要一起打包的文件效率过低，所以可以编写一个 spec 文件来告诉 PyInstaller 要如何打包。&lt;/p&gt;&#xA;&lt;p&gt;（这是我之前尝试打包我的程序是用到的 spec 文件，但是因为不支持&lt;code&gt;entry_points&lt;/code&gt;的原因，所以我最后放弃了使用这个办法，但是打包出来的程序在不用到&lt;code&gt;entry_points&lt;/code&gt;的情况下是跟直接使用 pip 安装行为一致的。）&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;bgmi.spec&lt;/code&gt;&lt;/p&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# -*- mode: 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:#f92672&#34;&gt;from&lt;/span&gt; PyInstaller.building.api &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; EXE, PYZ&#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;from&lt;/span&gt; PyInstaller.building.build_main &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; Analysis&#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:#f92672&#34;&gt;import&lt;/span&gt; os&#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;import&lt;/span&gt; os.path&#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;import&lt;/span&gt; importlib&#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;bindata_dir &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;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;bgmi/front/templates&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:#e6db74&#34;&gt;&amp;#39;bgmi/lib/models/migrations&amp;#39;&lt;/span&gt;,&#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;&#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;get_bindata&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;for&lt;/span&gt; dir_path &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; bindata_dir:&#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;for&lt;/span&gt; file &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;listdir(dir_path):&#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;yield&lt;/span&gt; (os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;join(dir_path, file), dir_path)&#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;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;block_cipher &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;&#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;package_imports &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;peewee_migrate&amp;#39;&lt;/span&gt;, [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;template.txt&amp;#39;&lt;/span&gt;]]]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;datas &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; list(get_bindata())&#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;for&lt;/span&gt; package, files &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; package_imports:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    proot &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;dirname(importlib&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;import_module(package)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;__file__)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    datas&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;extend((os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;join(proot, f), package) &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; f &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; files)&#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;a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Analysis([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;bgmi/__main__.py&amp;#39;&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             pathex&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             hiddenimports&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;             hookspath&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             datas&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;datas,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             runtime_hooks&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             cipher&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;block_cipher)&#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;pyz &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; PYZ(a&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;pure, cipher&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;block_cipher)&#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;exe &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; EXE(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pyz,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    a&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;scripts,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    a&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;binaries,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    a&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;zipfiles,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    a&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;datas,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;bgmi&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    debug&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    strip&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    upx&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    console&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    bootloader_ignore_signals&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;,&#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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中，&lt;code&gt;a = Analysis([&#39;bgmi/__main__.py&#39;],&lt;/code&gt;为程序的入口就是原本如果使用命令行的话，在 PyInstaller 后面跟的那个 py 文件路径。&lt;/p&gt;</description>
    </item>
    <item>
      <title>参与python文档的中文翻译</title>
      <link>https://blog.trim21.me/2019/03/join-python-zh-cn-translaters/</link>
      <pubDate>Sun, 31 Mar 2019 01:28:36 +0800</pubDate>
      <guid>https://blog.trim21.me/2019/03/join-python-zh-cn-translaters/</guid>
      <description>&lt;p&gt;今天看到这个帖子&lt;a href=&#34;https://www.v2ex.com/t/550164&#34;&gt;别开心太早， Python 官方文档的翻译差远了 - V2EX&lt;/a&gt; 发现参与 python 文档翻译的门槛还挺低的，就尝试了一下翻译了两段文档.&lt;/p&gt;&#xA;&lt;h2 id=&#34;参与翻译的方法&#34;&gt;参与翻译的方法&lt;/h2&gt;&#xA;&lt;p&gt;按照 &lt;a href=&#34;https://www.python.org/dev/peps/pep-0545/&#34;&gt;pep-545&lt;/a&gt;的说法, 有三步需要做:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;注册一个 &lt;a href=&#34;https://bugs.python.org&#34;&gt;https://bugs.python.org&lt;/a&gt; 的账号, 这个用户名在签 license 的时候会用到.&lt;/li&gt;&#xA;&lt;li&gt;签 license &lt;a href=&#34;https://www.python.org/psf/contrib/&#34;&gt;介绍&lt;/a&gt; 具体签署是在&lt;a href=&#34;https://www.python.org/psf/contrib/contrib-form/&#34;&gt;这个页面上&lt;/a&gt; 用的 adobe sign, 填完那个 iframe 里面的几个框就能提交了.&lt;/li&gt;&#xA;&lt;li&gt;注册 transifex, 选择自己的语言, 并且&lt;a href=&#34;https://www.transifex.com/python-doc/python-newest/&#34;&gt;申请加入&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;然后等待被允许加入团队, 然后就可以开始翻译了.&lt;/p&gt;&#xA;&lt;p&gt;翻译是以每段为单位进行的&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blog.trim21.me/static/bd69bf14ly1g1l2x2j9x2j20yh0po7fd.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/python/python-docs-zh-cn&#34;&gt;python/python-docs-zh-cn: zh_CN translation of the Python documentation&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;中文的 po 文件在这个仓库里, 每个小时会有一个 bot 会自动把 transifex 上面的翻译同步到仓库里面去, 但是自己的名字并不会出现在这个仓库的 contributors 里面, 233&lt;/p&gt;</description>
    </item>
    <item>
      <title>基于asyncio的web框架aiohttp</title>
      <link>https://blog.trim21.me/2018/10/python-aiohttp/</link>
      <pubDate>Fri, 05 Oct 2018 17:42:21 +0800</pubDate>
      <guid>https://blog.trim21.me/2018/10/python-aiohttp/</guid>
      <description>&lt;p&gt;本来想扯一通标准库里添加了&lt;code&gt;asyncio&lt;/code&gt;的意义, 什么统一了异步框架, 什么方便代码前移之类的了.&#xA;然后发现原来大家也都是用装饰器+生成器来写的, 好像也没啥区别&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;迁移的主要阻力也不是各个框架实现异步的方式不同, 而是用到了框架的某些特性, 在其他框架里可能没有, &lt;code&gt;asyncio&lt;/code&gt;成为标准库也改变不了这一点.&lt;/p&gt;&#xA;&lt;p&gt;不过 python3.4 3.5 3.6 添加了很多新功能,语言层面的异步支持越来越好了&lt;/p&gt;&#xA;&lt;p&gt;在 3.4 就是上面说的, 引入了&lt;code&gt;asyncio&lt;/code&gt;的标准库.&lt;/p&gt;&#xA;&lt;p&gt;3.5 有了一系列的 bug fix ,可以见&lt;a href=&#34;https://aiohttp.readthedocs.io/en/stable/faq.html#why-is-python-3-5-3-the-lowest-supported-version&#34;&gt;why-is-python-3-5-3-the-lowest-supported-version&lt;/a&gt;, 还支持了&lt;code&gt;async/await&lt;/code&gt;语法.&lt;/p&gt;&#xA;&lt;p&gt;不过 3.5 的时候&lt;code&gt;async/await&lt;/code&gt;还不是关键字, 还可以给&lt;code&gt;async&lt;/code&gt;赋值, 所以到了 python3.7 的时候挂了一堆库, 因为他们用了&lt;code&gt;async&lt;/code&gt;当变量&amp;hellip;&lt;/p&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; asyncio&#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;import&lt;/span&gt; sys&#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;print(sys&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;version_info) &lt;span style=&#34;color:#75715e&#34;&gt;# 3.5.4&lt;/span&gt;&#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;&#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;async&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;hello&lt;/span&gt;():&#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;#34;Hello world!&amp;#34;&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;# 异步调用asyncio.sleep(1):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    r &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; asyncio&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sleep(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#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;#34;Hello again!&amp;#34;&lt;/span&gt;)&#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;&#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;async&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt;)&#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:#75715e&#34;&gt;# 获取EventLoop:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;loop &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; asyncio&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get_event_loop()&#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;# 执行coroutine&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;loop&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;run_until_complete(hello())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;loop&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;close()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;会输出&lt;/p&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;-webkit-text-size-adjust:none;&#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:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Hello world!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Hello again!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是如果到了 python3.7, 会报错&lt;code&gt;SyntaxError&lt;/code&gt;, 也因为这个原因挂了一堆库.&lt;/p&gt;</description>
    </item>
    <item>
      <title>自动重新构建部署博客</title>
      <link>https://blog.trim21.me/2017/05/auto-deploy-with-webhook/</link>
      <pubDate>Sun, 14 May 2017 04:57:28 +0800</pubDate>
      <guid>https://blog.trim21.me/2017/05/auto-deploy-with-webhook/</guid>
      <description>&lt;p&gt;想折腾这个很久了,终于把这个折腾好了.&lt;/p&gt;&#xA;&lt;p&gt;现在写博客的流程是,我在本机维护一个 git repo,里面是我所有的文章.然后我写完一篇文章或者修改了文章之后 push 到 github 上去,相应的 github pages 就会根据用来保存文章的 repo 自动最新的状态.&lt;/p&gt;&#xA;&lt;p&gt;原本是在自己的 vps 上开了一个服务器处理 webhook, 现在换成了&lt;a href=&#34;https://travis-ci.org/&#34;&gt;travis-ci&lt;/a&gt;来自动部署.&lt;/p&gt;&#xA;&lt;p&gt;不得不说&lt;a href=&#34;https://travis-ci.org/&#34;&gt;travis-ci&lt;/a&gt;是个好东西. 如果你是开源项目, 是可以免费使用的, 只有 private 的仓库才需要付费.&lt;/p&gt;&#xA;&lt;p&gt;写个博客, 自然所有的东西都是公开的, 用他来构建也没什么问题.&lt;/p&gt;&#xA;&lt;p&gt;唯一的问题是, 构建之后的部署需要密钥, travis 自然也考虑到了这种问题, 可以在&lt;code&gt;more options&lt;/code&gt;- &lt;code&gt;settings&lt;/code&gt; - &lt;code&gt;Environment Variables&lt;/code&gt;中添加保密的环境变量, 这样一来我们只要去 github 生成一个可以 push 的 token, 用这个 token 又可以避免泄露凭证个第三方, 又可以利用公有服务操作我们的个人仓库.&lt;/p&gt;&#xA;&lt;p&gt;首先生成一个 token, 这个比较简单&lt;/p&gt;&#xA;&lt;p&gt;因为 github pages 要求 push 到&lt;code&gt;${username}.github.io&lt;/code&gt;的仓库中, 比如我的用户名是&lt;code&gt;trim21&lt;/code&gt;, 我就需要把文件 push 到&lt;code&gt;trim21.github.io&lt;/code&gt;去, 所以我们需要告诉&lt;code&gt;hexo&lt;/code&gt;他要操作的部署的仓库地址.&lt;/p&gt;&#xA;&lt;p&gt;而&lt;code&gt;_config.yml&lt;/code&gt;里面又不能使用环境变量, 只能每次部署的时候把对应的仓库链接给 echo 进去, 避免泄漏.&lt;/p&gt;&#xA;&lt;p&gt;我的&lt;code&gt;_config.yml&lt;/code&gt;文件结尾是这样的&lt;/p&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Deployment&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;## Docs: https://hexo.io/docs/deployment.html&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;deploy&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;type&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;git&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;branch&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;master&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后 echo 到&lt;code&gt;_config.yml&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>树莓派控制步进电机</title>
      <link>https://blog.trim21.me/2016/08/rasberrypi-and-stepping-motor/</link>
      <pubDate>Sat, 13 Aug 2016 21:53:02 +0800</pubDate>
      <guid>https://blog.trim21.me/2016/08/rasberrypi-and-stepping-motor/</guid>
      <description>&lt;p&gt;有一个题目需要用步进电机控制转速,而且需要控制转动特定的角度,所以找到了步进电机这种东西来拍照.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ubuntu安装matplotlib</title>
      <link>https://blog.trim21.me/2016/07/matplotlib/</link>
      <pubDate>Mon, 25 Jul 2016 19:26:07 +0800</pubDate>
      <guid>https://blog.trim21.me/2016/07/matplotlib/</guid>
      <description>&lt;p&gt;(可恶,git 用的不熟练,把 commit 丢了&amp;hellip;重写文章)&lt;/p&gt;&#xA;&lt;p&gt;总结一下,在安装了&lt;code&gt;NumPy&lt;/code&gt;之后还需要安装&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;freetype&lt;/li&gt;&#xA;&lt;li&gt;libpng&lt;/li&gt;&#xA;&lt;li&gt;libffi&lt;/li&gt;&#xA;&lt;li&gt;cairocffi&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;freetype 下载地址 &lt;a href=&#34;http://download.savannah.gnu.org/releases/freetype/&#34;&gt;http://download.savannah.gnu.org/releases/freetype/&lt;/a&gt;&lt;/p&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;-webkit-text-size-adjust:none;&#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;wget http://download.savannah.gnu.org/releases/freetype/freetype-2.6.5.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar xvf freetype-2.6.5&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo make&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo make install&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;libpng 和 libffi 都在 apt 上有&lt;/p&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;-webkit-text-size-adjust:none;&#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;➜  artic git:&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;master&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; ✗ search libffi&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libffi-dev - Foreign Function Interface library &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;development files&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&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;-webkit-text-size-adjust:none;&#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;➜  artic git:&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;master&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; ✗ search libpng&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libpng12-0 - PNG library - runtime&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libpng12-dev - PNG library - development&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;直接 apt-get 安装即可&lt;/p&gt;&#xA;&lt;p&gt;调用&lt;code&gt;matplotlib&lt;/code&gt;的时候图像式全黑的,提示我安装&lt;code&gt;cairocffi&lt;/code&gt;,是 pip 上的包,安装了第三个之后直接&lt;code&gt;pip&lt;/code&gt;安装这个就可以了.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
