Post

HTTP 命令行工具 smms-cli 开发

因为写博客的时候经常用到http://sm.ms这个图床网站,所以希望能够写一个命令行交互的工具,更方便地上传图片,以及进行其他的操作。首先,放上用这个工具上传的pypi主页的照片,这也是我第一个pypi。

pypi.png

一些选择

其实网站提供的API功能很简单,甚至用cURL就可以搞定,但涉及到存储token和输入较长命令,还是想自己写一个简单的命令行工具。

之所以选择python,而不是更加适合写命令行工具的rust,是希望能更熟悉python的项目结构。其实Github上已经有一些类似的工具,为了不重复地造轮子,我希望我写的这个工具有以下几个功能,我也列出了对应的解决办法。

  • 开箱即用,不需要修改文件 -> 将token存储在文件中
  • 命令简单,都是单次操作 -> 使用argparse来解析参数,将py脚本打包
  • 结果好看,适合命令行环境 -> 使用pygments来渲染json文件
  • 下载简单,项目结构良好 -> 参考pypi的项目结构,并发布到pypi
  • 适合后续操作 -> 生成可以直接复制的md代码

一些实践

核心的代码部分其实很简单,用request库完成HTTP交互,用json库处理返回数据。我比较不熟悉的地方是发布到pypi,以及打包成命令行工具。

官方文档更像是新手入门教程,相对简单,并不包含我打包成命令行工具时需要使用的entry_point的用法。所以我找了另外一个博客,有更加详细的说明,包括发布前对于dist的检查。

总体来说我还是花了很多时间去找这些方法。倒不如平常多看看代码,对于这样的实现方法会更加有概念,而不是像这次一样,根据脑海中抽象的概念去寻找实际的API,非常麻烦。

这次编写的代码中,我对于每个函数都加入了参数类型和返回类型的检查,虽然不知道这样做有什么用(更加像C/C++了?),但感觉是个好习惯。

一些坑

  • 在pypi上发布新版本的时候要查看dist目录下的版本,不然会报错重复上传
  • 在发布成命令行工具(使用模块)和本地测试(使用文件时),import的目录不一样,不知道python有没有类似宏定义的方法来区分release和debug
1
2
from smms import utils # 发布成命令行工具
import utils # 测试脚本
  • 使用upload的endpoint时,头部添加Content-Type会有问题,因为那个头部是默认的,取消即可

常用命令

总结下来,一次简单的pypi发布流程为,可以把这些命令集成在Github Action中

1
2
3
4
5
vim ~/.pypirc # 添加token
# 修改项目代码,更新版本号
python3 -m build # 构建
pip3 install . # 本地安装,测试功能
python3 -m twine upload dist/* # 发布到pypi

在flatten list的时候用了一个one-line的嵌套for循环的方法,不需要借助numpy

1
2
3
>>> l = [[1,2],[3,4]]
>>> [item for sublist in list for item in sublist]
>>> l =[1,2,3,4]

参考链接

This post is licensed under CC BY 4.0 by the author.