Python CLI “-m” 参数

python 的-m mod 参数,它会将 Python 模块以脚本的形式运行。因此,如果该模块的实现支持命令行操作,我们就可以在命令行直接使用它。

服务端口测试

telnetlib 模块

测试对端服务器端口是否开放

1
python -m telnetlib -d localhost 22

结果如下

1
2
3
4
5
6
7
8
Telnet(localhost,22): recv b'SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.4\r\n'
SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.4

Telnet(localhost,22): send b'\n'
Telnet(localhost,22): recv b'Invalid SSH identification string.\r\n'
Invalid SSH identification string.
Telnet(localhost,22): recv b''
*** Connection closed by remote host ***

本地启动 web 服务

http.server 模块

1
2
3
4
5
6
7
❯ python -m http.server --help
usage: server.py [-h] [--cgi] [--bind ADDRESS] [--directory DIRECTORY] [port]
❯ python -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
150.132.93.4 - - [20/Apr/2022 11:02:47] "GET / HTTP/1.1" 200 -
150.132.93.4 - - [20/Apr/2022 11:02:47] code 404, message File not found
150.132.93.4 - - [20/Apr/2022 11:02:47] "GET /favicon.ico HTTP/1.1" 404 -

Note: 请勿在当前用户 home 目录起 http.server, 以免密钥丢失

验证及格式化 JSON 字符串

json.tool

1
2
3
4
5
6
7
8
❯ echo '{"name": {"first_name":"Chris", "last_name":"Tao"}, "age":33}' | python3 -m json.tool
{
"name": {
"first_name": "Chris",
"last_name": "Tao"
},
"age": 33
}

创建文本编辑器

idlelib 模块

临时替代代码编辑工具,代码是支持语法高亮

1
2
mkdir get_time_app
python -m idlelib get_time_app/print_time.py

如果文件目录不存在,idlelib将无法创建,因此如果必要,我们需要创建一个。我们运行完这个命令之后,print_time.py 只有执行保存的情况下才会创建到本地。现在应该会弹出编辑器,我们可以在里面写一些代码, 可以看到代码是支持语法高亮的。

创建可执行应用程序

zipapp

如果我们想要创建一个简单的应用,比如前面写的获取当前时间的应用程序,我们不必再需要像 PyInstaller 这样的第三方工具包,Python 内置的 Zipapp 就可以做到。假设我们要打包成一个”Get Time”的应用,我们可以在命令行运行下面的命令。

1
python -m zipapp get_time_app -m "print_time:main"

在该命令中,我们只需要给 zipapp设置 get_time_app 名称,指定 Python 程序的入口文件及其程序入口函数即可。以 .pyz 为扩展名的文件就是我们创建的应用程序,至此我们就可以将项目作为单个文件而不是文件夹进行分发。

该程序的启动方式也很简单,直接使用 Python 进行调用即可。

1
python get_time_app.pyz

编码和解码字符串或文件

base64, encodings.rot_13

通过 Python CLI,我们可以加密字符串或文件。我们以有趣的 ROT13 加密算法为例进行展示。ROT13 是一种偏移 13 位的凯撒密码,它的加密原理如下图所示。

使用 encodings.rot_13 来加密一个字符串,命令如下。

1
2
❯ echo "I am Chris" | python -m encodings.rot_13
V nz Puevf

切记,不要将其用于任何真正的加密内容。因为英文有 26 个字母,所以再次运行这个算法我们可以很容易地破译这个加密字符串:)

1
2
❯ echo 'V nz Puevf' | python -m encodings.rot_13
I am Chris

base64 编码

1
2
❯ echo "I am Chris" | python -m base64
SSBhbSBDaHJpcwo=

base64 解码

1
2
❯ echo "SSBhbSBDaHJpcwo=" | python -m base64 -d
I am Chris

base64 也经常用在对图像文件的编码和解码上。我们也可以对文件进行如下编码。

1
python -m base64 get_time_app/print_time.py

非常有趣的是,解码后的 Python 脚本可以即时执行,不会报错。。

1
echo "ZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKCgpkZWYgbWFpbigpOgogICAgY3VycmVudF90aW1lID0gZGF0ZXRpbWUubm93KCkKICAgIHByaW50KGYnQ3VycmVudCB0aW1lIGlzIHtjdXJyZW50X3RpbWV9LicpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIG1haW4oKQo=" | python -m base64 -d | python

获取系统元数据

sysconfig, site 模块

获取当前的系统信息

1
python -m sysconfig

获取 Python 环境路径和当前工作路径

1
python -m site

文件压缩解压

压缩文件,替代 tar/zip/gzip 等工具

压缩

1
python -m zipfile -c get_time_app.zip get_time_app

解压

1
python -m zipfile -e get_time_app.zip get_time_app_extracted

我们刚刚以 zip 文件为例进行了展示,Python 除了支持 zip 格式的解压缩以外,还支持 tar 和 gzip 的解压缩。