近期在雾凇拼音项目的帮助下入坑了rime,现在已经是我日常必备的软件。然而rime使用过程中有一个很大的不便是词库问题,虽然已经有深蓝词库转换可以支持词库间的转换,但依然存在一些特定情况,需要特殊处理。
比如我搜索不到医学相关的专业英语词库,所以只能爬取一些术语进行处理,自己制作一个词库,为了解决这类问题,我用自己为数不多的python能力写了一个jupyter,但是每次使用都要打开VSCode-打开文件-选择python环境-运行jupyter
非常心累😔
那我能不能做成命令行呢?
我非常喜欢的bilix,就是一款很方便的命令行工具,只要打开终端,输入几个字母,剩下的依靠终端自动补全,最后黏贴一下链接,回车即可,一般不超过3s
说干就干,打开bili大学搜索argparse(argparse这个包是我翻看bilix最早的git版本用到的,此外也可以用click)VSCode!启动!
经过一番折腾,总算可以在本地运行了
python rimetool --input-path sample_input/vcf_sample.vcf --tool vcf
那我能不能做成pip包呢?
还是非常喜欢的bilix,就支持pip安装,只要打开终端,输入`pip install bilix`,就能马上使用,相比起来需要去github下载我的源码然后再解压才能使用,不够方便
所以我又前往bili大学深造,再次一番折腾,总算把rimetool上传到了pypi上,现在你也可以非常优雅地使用它
pip install rimetool
rimetool --input-path sample_input/vcf_sample.vcf --tool vcf
如何制作年轻人的第一款pip包
经过前面的铺垫,想必你已经大致了解如何制作一个pip包的流程
- 写好源码,实现好功能
- 增加命令行的支持
- 制作pip包上传pypi
本文篇幅有限,第一步我python水平有限讲不好,第二步命令行网络教程也已经比较完备,所以略过这两步。第三步的网络教程我不是很满意而且难度不高,所以这里斗胆写教程一篇
申请账号及获取密钥
首先,前往pypi官网申请账号(比较简单,就不赘述了)
然后在账号管理界面申请一个api token
取一个好听的名字,选择entire account,这个token的权限最高,不建议日常使用,之后成功创建项目以后可以新建一个项目专属的token专门用来处理本项目
保存好生成的token到记事本(只出现一次,关闭这个页面就不会出现了),我们来到最后一步,配置本地环境的token
以macOS为例,新建一个文件$HOME/.pypirc
,比如/Users/whitewatercn/.pypirc
用文本编辑器或者vim
等工具编辑它,保存即可
[pypi]
username = __token__
password = 你上面申请到的token
接下来开始编译吧!
进入你的项目主目录,配置setup.py
,这个文件里设置了诸多pip包相关信息,以我的为例
from setuptools import setup, find_packages
setup(
# 以下为必需参数
name='rimetool', # 模块名
version='0.1.2', # 当前版本
description='rime输入法相关工具', # 简短描述
packages=find_packages(include=['rimetool', 'rimetool.*']), # 包含rimetool和rimetool下的所有子包
# 以下均为可选参数
long_description="rime输入法相关工具",# 长描述
url='https://github.com/whitewatercn/rimetool', # 主页链接
author='whitewatercn', # 作者名
author_email='whitewatercn@outlook.com', # 作者邮箱
classifiers=[
'Intended Audience :: Developers', # 模块适用人群
'Topic :: Software Development :: Build Tools', # 给模块加话题标签
],
keywords=['rime','input method editor tool','python'], # 模块的关键词,使用空格分割
install_requires=['pypinyin',
'argparse',
'click'], # 依赖模块
python_requires='>=3.0', # 模块支持的Python版本
entry_points={ # 新建终端命令并链接到模块函数
'console_scripts': [
'rimetool=rimetool.main:main',
],
},
project_urls={ # 项目相关的额外链接
'Bug Reports': 'https://github.com/whitewatercn/rimetool/issues',
'Source': 'https://github.com/whitewatercn/rimetool',
},
)
这里面有些是必须有的,有些不必要,你可以尝试删减一些内容,特别注意的是
- 如果你的项目里引用了自己制作的包,需要配置好
packages=find_packages(include=['rimetool', 'rimetool.*'])
- 如果引用其他pip包,需要配置好
install_requires=['pypinyin','argparse','click']
如果你碰到引用方面的报错,说实话我也不会,我是靠gpt重写解决的🐶
配置好后,就能在 setup.py
所在的路径开始编译,在此之前你需要安装编译所需的twine
和wheel
pip install wheel twine
之后执行
python setup.py sdist bdist_wheel
这会在工作目录里产生很多编译文件,如果你需要上传源码到github,记得编辑.gitignore
忽略它们
(torch) (base) whitewatercn@MadBookAir rimetool % tree -L 1
.
├── LICENSE
├── README.md
├── rimetool
├── sample_input
└── setup.py
(torch) (base) whitewatercn@MadBookAir rimetool % python setup.py sdist bdist_wheel
(torch) (base) whitewatercn@MadBookAir rimetool % tree -L 1
.
├── LICENSE
├── README.md
├── build
├── dist
├── rimetool
├── rimetool.egg-info
├── sample_input
└── setup.py
最后上传pypi之前我强烈建议你先在本地运行一下,试试能不能按照你的预想跑起来
pip install -e .
通过这行命令在本地安装好你的项目,同时你对源代码的编辑可以实时更新,等你调整到满意以后,我们开始上传吧!
最后一步,上传!
将最新的源码编译后,在setup.py
的路径执行
twine upload dist/*
这将自动使用我们之前创建的$HOME/.pypirc
里面的token,不出意外的话就上传成功啦
你也可能遇到一些问题,可以通过以下命令查看具体问题出在哪里,里面的报错非常详细
twine upload dist/* --verbose
比如我刚刚试着重新传了一次,就提醒我已经传过这个版本了File already exists.
(torch) (base) whitewatercn@MadBookAir rimetool % twine upload dist/* --verbose
INFO Using configuration from /Users/whitewatercn/.pypirc
Uploading distributions to https://upload.pypi.org/legacy/
INFO dist/rimetool-0.1.2-py3-none-any.whl (16.0 KB)
INFO dist/rimetool-0.1.2.tar.gz (16.3 KB)
INFO password set from config file
INFO username: __token__
INFO password: <hidden>
Uploading rimetool-0.1.2-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 20.0/20.0 kB • 00:00 • 57.1 MB/s
INFO Response from https://upload.pypi.org/legacy/:
400 File already exists. See https://pypi.org/help/#file-name-reuse for more information.
INFO <html>
<head>
<title>400 File already exists. See https://pypi.org/help/#file-name-reuse for more information.</title>
</head>
<body>
<h1>400 File already exists. See https://pypi.org/help/#file-name-reuse for more information.</h1>
The server could not comply with the request since it is either malformed or otherwise incorrect.<br/><br/>
File already exists. See https://pypi.org/help/#file-name-reuse for more information.
</body>
</html>
ERROR HTTPError: 400 Bad Request from https://upload.pypi.org/legacy/
File already exists. See https://pypi.org/help/#file-name-reuse for more information.
根据我最近折腾的经历,最常见的是命名及版本问题
- pip包不可以重名
- 新版本的
setup.py
里version=''
要大于过去的版本
最后
祝各位年轻人早日喜提自己的第一个pip包
也欢迎使用rime的朋友使用&完善rimetool