- 使用命令行接口定义与解析框架 Click ,面向对象设计命令,妈妈再也不用担心我秃头
- 使用花里胡哨但非常好看的命令行富文本打印工具 Rich ,就一个字:巴适
- 从接口到配置全程使用 Python,一套功夫打包带走
- Python 最新版!兼容性?那啥玩意儿
- 本地的命令集,适合联动自己写的加密工具或者编码工具,或者直接基于此开发,肥肠氨醛
- 蒸馍?泥不扶?不扶就撸!
这是一套使用 Python 开发的本地命令行指令集合,旨在在本地任何地方都能调用自己【定制】的指令。
它使用 Click 编写指令、使用 Rich 美化打印,均以面向对象的方式进行开发,可以通过相同的方式来定制你的本地命令行指令,同时,它并不局限于本地,你随时可以使用带有网络通信功能的 Python 包来实现网络交互。
部分指令会以导入 Python 包的方式读取配置,这种方式可以省去很多解析和封装,降低定制成本和使用门槛。调用这些指令前,必须先进行配置。同样地,可以使用相同的方式来存放【专属于你的】配置。
需要 Python 3.11 或以上版本。
直接克隆仓库:
git clone https://github.com/aixcyi/Shulker.git "shulker"
或者
git clone https://gitee.com/aixcyi/shulker.git "shulker"
创建虚拟环境并安装依赖包:
cd ./shulker
python -m venv ./venv
"./venv/Scripts/activate.bat"
pip install -r ./requirements.txt
离开虚拟环境后试着运行一下主命令:
deactivate
"./shulker.py" --help
如果出现 ImportError
这样的导入错误,那么需要修改注册表的两条文件关联:
"./venv/Scripts/activate.bat"
python ./shulker.py fixreg > restore.reg
- 若提示 py.exe 不存在,请尝试修复或重新安装 Python。
- 若两条都提示修改成功,则完毕。
- 若出现其它错误,请双击
restore.reg
文件,还原文件关联!!!!!!!!!!
最后,将仓库目录添加到环境变量 PATH
中,以便随时随地调用仓库里的命令。
去到刚刚克隆的仓库中,直接安装依赖:(因为我在WSL中没有使用虚拟环境)
pip3 install -r ./requirements.txt
看一下python3装到哪里去了(如果用虚拟环境要看虚拟环境的python3),一般是 #!/usr/bin/python3.11
which python3
然后修改所有py文件的 shebang、添加执行权限、创建符号链接:
python3 ./shulker.py migrate
最后,在 .bashrc
里将仓库目录添加到PATH中:
PATH=你的仓库目录:$PATH
之后,你就可以在其它任何地方直接调用命令了。
没有环境。哪位好心的大佬愿意轻抬小手挥挥衣袖帮俺补上
直接更新仓库:
git fetch
git pull
如果网络比较差,可以:
git remote set-url origin https://gitee.com/aixcyi/shulker.git
git fetch
git pull
如果解释器也是 ./venv/Scripts/python.exe
的话那么就没有后续操作。
如果不是,那么需要使用 你的解释器 运行迁移来修改所有源文件的 shebang :
python ./shulker.py migrate
修改所有源文件的 shebang(一般是 #!/usr/bin/python3.11
,具体看你装到哪里去了):
python3 ./shulker.py shebang --set
然后给所有 Python 源码添加执行权限:
chmod +x ./*.py
目前的命令都是使用
-h
和--help
风格,没有用/?
风格,因为整体迁移比较麻烦懒。
主命令是 shulker
,你可以通过它来浏览所有命令,包括弃用的:
shulker list
查看隐藏的命令:
shulker list -a
配置指的是命令读取的预先设置的东西,以一个 Python 包的形式存放在项目根目录下,其名为 "configs" ,鲲之大,一锅装不下。
文件记录。被命令 edit
用于打开文件。
from typing import NamedTuple
# NamedTuple的子类不能继承,所以需要重新定义
# 可以定义多个,以提供不同的默认值。但结构必须与 FileShortcut 一致
class VSCodeShortcut(NamedTuple):
name: str
path: str
editor: str = 'code' # 默认值,应当是可以直接在命令行执行的字符串
FILES = [
VSCodeShortcut('shulker', r'C:\Users\MyName\Desktop\shulker\configs\__init__.py'),
VSCodeShortcut('frpc', '/myusername/frp/frpc.ini'),
]
from configs import FILES
from core.configurators import FileShortcut
FILES: list[FileShortcut]
命令配置。被命令 yudo
用于运行程序/项目/脚本等。
from core.configurators import Command
class CompanyProject(Command):
name = 'abc.d'
main = 'python -X utf8 ./manage.py'
note = '公司项目'
before = [
'title xxx后台管理系统',
r'cd C:\Users\MyName\companyABC\abc-xxx-server',
'call ./venv/Scripts/activate.bat',
]
actions = {
'mkms': 'makemigrations',
'migrate': 'migrate',
'run': 'runserver 127.0.0.1:7777',
}
COMMANDS = [
CompanyProject,
]
from configs import COMMANDS
from core.configurators import Command
COMMANDS: list[type[Command]]
yudo abc.d mkms # python -X utf8 ./manage.py makemigrations
yudo abc.d migrate # python -X utf8 ./manage.py migrate
yudo abc.d run # python -X utf8 ./manage.py runserver 127.0.0.1:7777
yudo abc.d runserver 0.0.0.0:80 # python -X utf8 ./manage.py runserver 0.0.0.0:80
yudo abc.d --help # python -X utf8 ./manage.py --help
参考信息。被命令 shulker ref
用来列出一些用于参考的信息,但其实……你完全可以把它当成一个备忘录。
# 不要问我为什么不定义成一个dict,谁也不知道以后会不会有更多列
REFERENCES = [
(), # 空一行
('Python 语法清单', 'https://cheatsheets.zip/python'),
]
from configs import REFERENCES
from rich.console import ConsoleRenderable, RichCast
REFERENCES: list[tuple | tuple[str, None | ConsoleRenderable | RichCast | str]]
自定义字符集。被命令 mkstr
按照不同字符集生成随机字符串,使用命令 char set
可以浏览这里配置的所有字符集。
# 所有符号都会被当作字符集,所以如果实在需要导入其它符号,记得完事之后用 del 删除
# 因为 mkstr 的很多选项都需要用到下面的字符集,所以直接搬走就好了
digit = '0123456789'
upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
lower = 'abcdefghijklmnopqrstuvwxyz'
alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
digit_safe = '23456789'
upper_safe = 'ABCDEFGHJKLMNPQRSTUVWXYZ'
lower_safe = 'abcdefghijklmnpqrstuvwxyz'
symbol = ''.join(c for c in map(chr, range(33, 127)) if not c.isalpha() and not c.isdigit())
symbol_normal = r"`-=[]\;',./"
symbol_shift = r'~!@#$%^&*()_+{}|:"<>?'
base16 = '0123456789ABCDEF'
base64 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/'
base36 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXY'
base62 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
# print(''.join(sorted(symbol)))
# print(''.join(sorted(symbol_normal + symbol_shift)))
assert sorted(symbol) == sorted(symbol_normal + symbol_shift)
# 空一行方便你选择文本。爱护大小熊猫,坚决抵制夺笋
from configs import charsets
import typing
charsets: type(typing) # 意思就是说 charsets 是一个 Python 包
需要在项目根目录下创建 Python 文件,因为在全局环境中不容易访问子目录。
模板大致如下:
#!./venv/Scripts/python.exe
# -*- coding: UTF-8 -*-
import click
@click.command(__name__, short_help='我的命令')
@click.argument('yourname')
@click.option('-u', '--upper', is_flag=True, help='输出全大写的句子。')
def invoker(yourname: str, upper: bool):
"""
这是我的第一个命令。
"""
message = f'Hello, {yourname}.'
if upper:
message = message.upper()
print(message)
if __name__ == '__main__':
invoker() # click 会自动读取 sys.argv
保存到名为 meow.py
的文件中之后调用(非Windows用户记得加一下执行权限)
meow --help
它会输出
Usage: meow.py [OPTIONS] YOURNAME
这是我的第一个命令。
Options:
-u, --upper 输出全大写的句子。
--help Show this message and exit.
确定本机有没有安装 python3.11 :
which python3.11
which python3
没有的话,安装之前搜索一下看看有没有 3.11:
apt search python3 | grep ^python3.11
有就直接安装好了。
没有的话可以通过 PPA 来安装 Python(安装之后应该是 /usr/bin/python3.11
):
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.11
然后在当前用户 Home 目录的 .bashrc
里设置别名:
- 如果原本就有
python3
那么尽量避免覆盖,因为 Ubuntu 很多库都依赖 python
alias py3='python3.11'
- 否则可以设置比较常用的别名
alias python3='python3.11'
别忘了
source ~/.bashrc
确定本机有没有安装 pip3,有的话看一下版本是不是对应了 Python 3.11
which pip3
pip3 -V
如果没有或者不是,需要另外安装 pip3 并在 .bashrc
里设置别名:
(从这里往后都假设你设置的别名是 python3 和 pip3 )
wget https://bootstrap.pypa.io/pip/get-pip.py
python3 ./get-pip.py
(由于我用的是WSL,不太需要虚拟环境,所以没有攻略)