当前位置: 首页 > 编程日记 > 正文

基于Golang的CLI 命令行程序开发

基于Golang的CLI 命令行程序开发 【阅读时间:约15分钟】

  • 一. CLI 命令行程序概述
  • 二. 系统环境&项目介绍&开发准备
    • 1.系统环境
    • 2.项目介绍
    • 3.开发准备
  • 三.具体程序设计及Golang代码实现
  • 1.selpg的程序结构
  • 2.导入的库
  • 3.sp_args结构体
  • 4.全局变量
  • 4.main函数
  • 5.process_args函数
  • 6.process_args函数
  • 7.usage函数
  • 四.程序测试
    • 1.功能测试
      • (1)`selpg -s1 -e1 in.txt`
      • (2)`selpg -s1 -e1 < in.txt`
      • (3)`other_command | selpg -s1 -e1`
      • (4)`selpg -s1 -e1 in.txt >out.txt`
      • (5)`selpg -s20 -e20 in.txt 2>error.txt`
      • (6)`selpg -s1 -e1 in.txt >out.txt 2>error.txt`
      • (7)`selpg -s20 -e20 in.txt >out.txt 2>/dev/null`
      • (8)`selpg -s10 -e20 in.txt >/dev/null`
      • (9)`selpg -s10 -e20 input_file 2>error_file | other_command`
      • (10)`selpg -s10 -e20 input_file 2>error_file | other_command`
      • (11)`selpg -s1 -e1 -l10 in.txt`
      • (12)`selpg -s1 -e1 -f in.txt`
      • (13)`selpg -s1 -e1 in.txt | cat -n`
      • (14)`selpg -s10 -e20 in.txt > out.txt 2>error.txt &`
    • 2.单元测试
  • 五.完整代码
  • 六. References



一. CLI 命令行程序概述

CLI(Command Line Interface)实用程序是Linux下应用开发的基础。正确的编写命令行程序让应用与操作系统融为一体,通过shell或script使得应用获得最大的灵活性与开发效率。例如:

Linux提供了cat、ls、copy等命令与操作系统交互;
go语言提供一组实用程序完成从编码、编译、库管理、产品发布全过程支持;
容器服务如docker、k8s提供了大量实用程序支撑云服务的开发、部署、监控、访问等管理任务;
git、npm等也是大家比较熟悉的工具。

尽管操作系统与应用系统服务可视化、图形化,但在开发领域,CLI在编程、调试、运维、管理中提供了图形化程序不可替代的灵活性与效率。


二. 系统环境&项目介绍&开发准备

1.系统环境

操作系统:CentOS7
硬件信息:使用virtual box配置虚拟机(内存3G、磁盘30G)
编程语言:GO 1.15.2

2.项目介绍

本项目的开发主要基于IBM Developer社区的C语言程序(https://www.ibm.com/developerworks/cn/linux/shell/clutil/index.html),出于熟悉golang语言的目的,笔者主要的工作只是将其翻译为golang格式,其中还使用了部分库,如os和pflag,再次感谢原作者及开源代码工作者。

项目完成后的运行效果与CLI 命令行程序一致,一个简单的输出文本第一页20行的内容的例子如下:
在这里插入图片描述

3.开发准备

①首先下载上文的C语言源码(点击下载)
②安装并使用 pflag 替代 goflag 以满足 Unix 命令行规范,此处出于篇幅考虑,只在后面的函数介绍时给出部分使用教程,详细的pflag 使用教程可见【六. References. 1. Golang之使用Flag和Pflag】
③将C语言源码翻译为golang语言


三.具体程序设计及Golang代码实现

1.selpg的程序结构

selpg的程序结构非常简单,主要有以下组成:
①sp_args结构
②main函数
③process_args函数
④process_input函数
⑤usage函数

2.导入的库

主要要导入的库有:
①bufio:用于文件的读写
②io:用于文件读写、读环境变量
③pflag:用于解释命令行参数,替代 goflag 以满足 Unix 命令行规范

/*================================= includes ======================*/package mainimport ("bufio""fmt""io""os""os/exec""github.com/spf13/pflag"
)

3.sp_args结构体

sp_args结构体是用于记录数据的结构体,分别记录着开始页码,结束页码,文件名,每页大小,页的类型和打印输出位置等信息。

/*================================= types =========================*/type sp_args struct {start_page  intend_page    intin_filename stringpage_len    int  /* default value, can be overriden by "-l number" on command line */page_type   bool /* 'l' for lines-delimited, 'f' for form-feed-delimited *//* default is 'l' */print_dest string
}

4.全局变量

全局变量共有两个:
①progname是程序名,在输出错误信息时有用;
②用 INT_MAX 检查一个数是否为有效整数,由于golang没有预定义的INT_MAX,此处用别的方式来手动实现

/*================================= globals =======================*/var progname string                /* program name, for error messages */
const INT_MAX = int(^uint(0) >> 1) //golang需要手动声明INT_MAX

4.main函数

main函数作为程序的入口,给出了整个程序的大概运行过程。
①首先进行sp_args变量和progname的初始化,其中主要的默认属性为开始页码和结束页码均为1,每页长度为20行,不可用用换页符换页
②然后调用process_args函数来处理输入时的各种参数错误
③最后才调用process_input函数来执行输入的参数。

/*================================= main()=== =====================*/func main() {var sa sp_argssa.start_page = 1sa.end_page = 1sa.in_filename = ""sa.page_len = 20 //默认20行一页sa.page_type = falsesa.print_dest = ""/* save name by which program is invoked, for error messages */progname = os.Args[0]process_args(len(os.Args), &sa)process_input(sa)
}

5.process_args函数

process_args函数用于处理输入时的各种参数错误。
①首先通过pflag绑定各参数和usage函数
②然后判断各种参数的错误即可,比如起始页码是负数,终止页码小于起始页码等情况,具体的错误情况在代码中已给出注释
③当发生错误,首先通过pflag.usage函数输出正确的指令参数格式来提醒用户,并通过os.Exit函数退出程序

/*================================= process_args() ================*/func process_args(ac int, psa *sp_args) {//指令格式:selpg -sstart_page -eend_page [-lline | -f ] [-d dstFile] filename//使用pflag绑定各参数, psa初始化pflag.Usage = usagepflag.IntVarP(&psa.start_page, "start_page", "s", 1, "Start page")pflag.IntVarP(&psa.end_page, "end_page", "e", 1, "End page")pflag.IntVarP(&psa.page_len, "page_len", "l", 20, "Lines per page")pflag.BoolVarP(&psa.page_type, "page_type", "f", false, "Page type")pflag.StringVarP(&psa.print_dest, "dest", "d", "", "Destination")pflag.Parse()/* check the command-line arguments for validity */if ac < 3 { /* Not enough args, minimum command is "selpg -sstartpage -eend_page"  */fmt.Fprintf(os.Stderr, "%s: not enough arguments\n", progname)pflag.Usage()os.Exit(1)}/* handle 1st arg - start page */temp := os.Args[1]if temp[0:2] != "-s" { fmt.Fprintf(os.Stderr, "%s: 1st arg should be -sstart_page\n", progname)pflag.Usage()os.Exit(2)}if psa.start_page < 1 || psa.start_page > (INT_MAX-1) {fmt.Fprintf(os.Stderr, "%s: invalid start page %d\n", progname, psa.start_page)pflag.Usage()os.Exit(3)}/* handle 2nd arg - end page */temp = os.Args[2]if temp[0:2] != "-e" {fmt.Fprintf(os.Stderr, "%s: 2nd arg should be -eend_page\n", progname)pflag.Usage()os.Exit(4)}if psa.end_page < 1 || psa.end_page > (INT_MAX-1) || psa.end_page < psa.start_page {fmt.Fprintf(os.Stderr, "%s: invalid end page %d\n", progname, psa.end_page)pflag.Usage()os.Exit(5)}/* now handle optional args *///使用pflag,selpg.c的while+switch可去掉if psa.page_len != 5 {if psa.page_len < 1 {fmt.Fprintf(os.Stderr, "%s: invalid page length %d\n", progname, psa.page_len)pflag.Usage()os.Exit(6)}}if pflag.NArg() > 0 { /* there is one more arg */psa.in_filename = pflag.Arg(0)/* check if file exists */file, err := os.Open(psa.in_filename)if err != nil {fmt.Fprintf(os.Stderr, "%s: input file \"%s\" does not exist\n", progname, psa.in_filename)os.Exit(7)}/* check if file is readable */file, err = os.OpenFile(psa.in_filename, os.O_RDONLY, 0666)if err != nil {if os.IsPermission(err) {fmt.Fprintf(os.Stderr, "%s: input file \"%s\" exists but cannot be read\n", progname, psa.in_filename)os.Exit(8)}}file.Close()}}

6.process_args函数

process_input函数用于执行输入的参数,执行文件读写和输出到屏幕等操作。其中由于没有打印机,转而使用cat命令测试。

/*================================= process_input() ===============*/func process_input(sa sp_args) {var fin *os.File        /* input stream */var fout io.WriteCloser /* output stream */var c byte              /* to read 1 char */var line stringvar line_ctr int /* line counter */var page_ctr int /* page counter */var err errorcmd := &exec.Cmd{}/* set the input source */if sa.in_filename == "" {fin = os.Stdin} else {fin, err = os.Open(sa.in_filename)if err != nil {fmt.Fprintf(os.Stderr, "%s: could not open input file \"%s\"\n", progname, sa.in_filename)os.Exit(9)}}/* set the output destination */if sa.print_dest == "" {fout = os.Stdout} else {cmd = exec.Command("cat") //由于没有打印机,使用cat命令测试cmd.Stdout, err = os.OpenFile(sa.print_dest, os.O_WRONLY|os.O_TRUNC, 0600)if err != nil {fmt.Fprintf(os.Stderr, "%s: could not open output file \"%s\"\n", progname, sa.print_dest)os.Exit(10)}fout, err = cmd.StdinPipe()if err != nil {fmt.Fprintf(os.Stderr, "%s: could not open pipe to \"%s\"\n", progname, sa.print_dest)os.Exit(11)}cmd.Start()}/* begin one of two main loops based on page type */rd := bufio.NewReader(fin)if sa.page_type == false {line_ctr = 0page_ctr = 1for true {line, err = rd.ReadString('\n')if err != nil { /* error or EOF */break}line_ctr++if line_ctr > sa.page_len {page_ctr++line_ctr = 1}if page_ctr >= sa.start_page && page_ctr <= sa.end_page {fmt.Fprintf(fout, "%s", line)}}} else {page_ctr = 1for true {c, err = rd.ReadByte()if err != nil { /* error or EOF */break}if c == '\f' {page_ctr++}if page_ctr >= sa.start_page && page_ctr <= sa.end_page {fmt.Fprintf(fout, "%c", c)}}fmt.Print("\n") }/* end main loop */if page_ctr < sa.start_page {fmt.Fprintf(os.Stderr, "%s: start_page (%d) greater than total pages (%d), no output written\n", progname, sa.start_page, page_ctr)} else if page_ctr < sa.end_page {fmt.Fprintf(os.Stderr, "%s: end_page (%d) greater than total pages (%d), less output than expected\n", progname, sa.end_page, page_ctr)}fin.Close()fout.Close()fmt.Fprintf(os.Stderr, "%s: done\n", progname)
}

7.usage函数

usage函数用于输出正确的指令参数格式。

/*================================= usage() =======================*/func usage() {fmt.Fprintf(os.Stderr, "\nUSAGE: %s -sstart_page -eend_page [ -f | -llines_per_page ] [ -ddest ] [ in_filename ]\n", progname)
}



四.程序测试

1.功能测试

此处按照IBM的c语言程序的使用实例来进行功能测试。
首先在selpg目录下建立三个txt文件,分别为:
①in.txt, 用于输入的文本,内容如下(为方便演示,只有20行):
在这里插入图片描述

②out.txt, 保存输出的文本,内容初始为空
③error.txt,保存错误信息,内容初始为空

(1)selpg -s1 -e1 in.txt

该命令将把“in.txt”的第 1 页写至标准输出(也就是屏幕),因为这里没有重定向或管道。

[henryhzy@localhost selpg]$ selpg -s1 -e1 in.txt
Hello world!
I am HenryHZY.
line 1
iine 2
line 3
line 4
line 5
line 6
iine 7
line 8
line 9
line 10
line 11
iine 12
line 13
line 14
line 15
line 16
iine 17
line 18
selpg: done

(2)selpg -s1 -e1 < in.txt

该命令与示例 1 所做的工作相同,但在本例中,selpg 读取标准输入,而标准输入已被 shell/内核重定向为来自“in.txt”而不是显式命名的文件名参数。输入的第 1 页被写至屏幕。

[henryhzy@localhost selpg]$ selpg -s1 -e1 < in.txt
Hello world!
I am HenryHZY.
line 1
iine 2
line 3
line 4
line 5
line 6
iine 7
line 8
line 9
line 10
line 11
iine 12
line 13
line 14
line 15
line 16
iine 17
line 18
selpg: done

(3)other_command | selpg -s1 -e1

“other_command”的标准输出被 shell/内核重定向至 selpg 的标准输入。将第 1页写至 selpg 的标准输出(屏幕)。

[henryhzy@localhost selpg]$ ls | selpg -s1 -e1
error.txt
in.txt
out.txt
selpg.go
selpg: done

(4)selpg -s1 -e1 in.txt >out.txt

selpg 将第 1 页写至标准输出;标准输出被 shell/内核重定向至out.txt“”。
在这里插入图片描述

(5)selpg -s20 -e20 in.txt 2>error.txt

selpg 将第 20 页至标准输出(屏幕);所有的错误消息被 shell/内核重定向至“error.txt”。请注意:在“2”和“>”之间不能有空格;这是 shell 语法的一部分(请参阅“man bash”或“man sh”)。
在这里插入图片描述

(6)selpg -s1 -e1 in.txt >out.txt 2>error.txt

selpg 将第 1页写至标准输出,标准输出被重定向至“output_file”;selpg 写至标准错误的所有内容都被重定向至“error_file”。当“input_file”很大时可使用这种调用;您不会想坐在那里等着 selpg 完成工作,并且您希望对输出和错误都进行保存。
在这里插入图片描述

(7)selpg -s20 -e20 in.txt >out.txt 2>/dev/null

selpg 将第 20 页写至标准输出,标准输出被重定向至“output_file”;selpg 写至标准错误的所有内容都被重定向至 /dev/null(空设备),这意味着错误消息被丢弃了。设备文件 /dev/null 废弃所有写至它的输出,当从该设备文件读取时,会立即返回 EOF。
此处本应有的的error信息被丢弃了。
在这里插入图片描述

(8)selpg -s10 -e20 in.txt >/dev/null

selpg 将第 10 页到第 20 页写至标准输出,标准输出被丢弃;错误消息在屏幕出现。这可作为测试 selpg 的用途,此时您也许只想(对一些测试情况)检查错误消息,而不想看到正常输出。

[henryhzy@localhost selpg]$ selpg -s10 -e20 in.txt >/dev/null
selpg: start_page (10) greater than total pages (1), no output written
selpg: done

(9)selpg -s10 -e20 input_file 2>error_file | other_command

selpg 的标准输出透明地被 shell/内核重定向,成为“other_command”的标准输入,第 1页被写至该标准输入。“other_command”的示例可以是 lp,它使输出在系统缺省打印机上打印。“other_command”的示例也可以 wc,它会显示选定范围的页中包含的行数、字数和字符数。“other_command”可以是任何其它能从其标准输入读取的命令。错误消息仍在屏幕显示。

[henryhzy@localhost selpg]$ selpg -s1 -e1 in.txt | ps
selpg: donePID TTY          TIME CMD
10209 pts/0    00:00:00 bash
10528 pts/0    00:00:00 ps

(10)selpg -s10 -e20 input_file 2>error_file | other_command

与上面的示例 9 相似,只有一点不同:错误消息被写至“error_file”。
在这里插入图片描述

(11)selpg -s1 -e1 -l10 in.txt

该命令将页长设置为 10 行,这样 selpg 就可以把输入当作被定界为该长度的页那样处理。文本的前10行被写至 selpg 的标准输出(屏幕)。

[henryhzy@localhost selpg]$ selpg -s1 -e1 -l10 in.txt
Hello world!
I am HenryHZY.
line 1
iine 2
line 3
line 4
line 5
line 6
iine 7
line 8
selpg: done

(12)selpg -s1 -e1 -f in.txt

假定页由换页符定界。第 10页被写至 selpg 的标准输出(屏幕)。

[henryhzy@localhost selpg]$ selpg -s1 -e1 -f in.txt
Hello world!
I am HenryHZY.
line 1
iine 2
line 3
line 4
line 5
line 6
iine 7
line 8
line 9
line 10
line 11
iine 12
line 13
line 14
line 15
line 16
iine 17
line 18selpg: done

(13)selpg -s1 -e1 in.txt | cat -n

由于没有打印机,原测试的打印机输出改为cat输出。

[henryhzy@localhost selpg]$ selpg -s1 -e1 in.txt | cat -n
selpg: done1	Hello world!2	I am HenryHZY.3	line 14	iine 25	line 36	line 47	line 58	line 69	iine 710	line 811	line 912	line 1013	line 1114	iine 1215	line 1316	line 1417	line 1518	line 1619	iine 1720	line 18

(14)selpg -s10 -e20 in.txt > out.txt 2>error.txt &

该命令利用了 Linux 的一个强大特性,即:在“后台”运行进程的能力。在这个例子中发生的情况是:“进程标识”(pid)如 1234 将被显示,然后 shell 提示符几乎立刻会出现,使得您能向 shell 输入更多命令。同时,selpg 进程在后台运行,并且标准输出和标准错误都被重定向至文件。这样做的好处是您可以在 selpg 运行时继续做其它工作。
在这里插入图片描述

2.单元测试

根据查找的单元测试与功能测试的区别:

功能测试是站在用户的角度从外部测试应用查看效果是否达到
单元测试是站在程序员的角度从内部测试应用

既然已经测试过功能测试,那么在进行时单元测试,简单地以函数为单元测试调用情况即可。若是在结合输入输出正确与否,感觉有些多余了。:)

测试代码:

package mainimport "testing"func Test_usage(t *testing.T) {tes := []struct {name string}{{name: "Test_usage1"},{name: "Test_usage2"},}for _, tt := range tes {t.Run(tt.name, func(t *testing.T) {usage()})}
}func Test_process_args(t *testing.T) {tests := []struct {name stringlen  intsa   sp_args}{}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {process_args(tt.len, &tt.sa)})}
}func Test_process_input(t *testing.T) {tests := []struct {name stringsa   sp_args}{}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {process_input(tt.sa)})}
}func Test_main(t *testing.T) {tests := []struct {name string}{}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {main()})}
}

为了方便进行单元测试,此处使用vscode进行测试,直接点击相应函数上面的run test即可,非常方便~~
各个函数的测试截图如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述



五.完整代码

具体代码可见gitee仓库:gitee仓库



六. References

  1. Golang之使用Flag和Pflag
  2. 开发 Linux 命令行实用程序
  3. Package os

相关文章:

Photoshop创造氛围照片合成视频教程含素材

数百个高分辨率工具和9个完整项目&#xff01; 这个包包含开始创建史诗大气合成所需的一切-超过四个小时的基于项目的深入教程和超过400个合成工具。 大小解压后&#xff1a;10.7G 含课程素材文件 1920X1080 mp4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机…

java c++的区别_Java语言与C、C++之间的区别?

小伙伴你知道吗&#xff1f;Java是由C开发而来的&#xff0c;并且在当时一直被搁置。随着Java语言的崛起那么Java和C/C有什么不同和相同之处呢&#xff1f;通过上述我们知道那Java前身是C&#xff0c;并且保留了C的大部分内容&#xff0c;其编程方式也类似于C。但Java的句法更清…

Android编程获取网络连接状态及调用网络配置界面

获取网络连接状态 随着3G和Wifi的推广&#xff0c;越来越多的Android应用程序需要调用网络资源&#xff0c;检测网络连接状态也就成为网络应用程序所必备的功能。 Android平台提供了ConnectivityManager 类&#xff0c;用于网络连接状态的检测。 Android开发文档这样描述Connec…

学习在Unity中创建一个动作RPG游戏

游戏开发变得简单。使用Unity学习C#并创建您自己的动作角色扮演游戏&#xff01; 你会学到什么 学习C#&#xff0c;一种现代通用的编程语言。 了解Unity中2D发展的能力。 发展强大的和可移植的解决问题的技能。 了解游戏开发流程。 了解面向对象编程在实践中是如何工作的。 Le…

python数组对应元素相乘_python的几种矩阵相乘的公式详解

1. 同线性代数中矩阵乘法的定义&#xff1a; np.dot() np.dot(A, B)&#xff1a;对于二维矩阵&#xff0c;计算真正意义上的矩阵乘积&#xff0c;同线性代数中矩阵乘法的定义。对于一维矩阵&#xff0c;计算两者的内积。见如下Python代码&#xff1a; import numpy as np # 2-D…

c#属性中的get和set属性

get是给属性赋值&#xff0c;set是取属性的值。 get、set用法&#xff1a; 一是隐藏组件或类内部的真是成员&#xff1b; 二是用来建立约束的&#xff0c;比如&#xff0c;实现“有我没你”这种约束&#xff1b; 三是用来响应属性变化事件&#xff0c;当属性变化是做某事&#…

基于Golang的监听读取配置文件的程序包开发——simpleConfig_v1

基于Golang的监听&读取配置文件的程序包开发——simpleConfig_v1 【阅读时间&#xff1a;约10分钟】 一、配置文件概述二、系统环境&项目介绍1.系统环境2.项目的任务要求三、具体程序设计及Golang代码实现1. 数据结构2. init函数模块3.listen函数模块4.watch函数模块四…

如何在Mac环境下搭建svn服务器端环境

为什么80%的码农都做不了架构师&#xff1f;>>> 在Windows环境中&#xff0c;我们一般使用TortoiseSVN来搭建svn环境。在Mac环境下&#xff0c;由于Mac自带了svn的服务器端和客户端功能&#xff0c;所以我们可以在不装任何第三方软件的前提下使用svn功能&#xff0…

kitbash贫民区三维场景模型 Kitbash3d – Favelas

参观临时城市中心 想象一下新兴的后世界末日城市中心&#xff0c;这里有大量的临时住所、建筑群、小屋、道具和固定装置。用一系列非常详细的废弃街区快速构建您的场景&#xff0c;并用波纹铁、水箱、折叠椅和劣质电线进一步修饰它们。从足球场到摇摇欲坠的码头&#xff0c;每一…

python编程代码示例_python编程线性回归代码示例

用python进行线性回归分析非常方便&#xff0c;有现成的库可以使用比如&#xff1a;numpy.linalog.lstsq例子、scipy.stats.linregress例子、pandas.ols例子等。 不过本文使用sklearn库的linear_model.LinearRegression&#xff0c;支持任意维度&#xff0c;非常好用。 一、二维…

单例模式的两种实现方式对比:DCL (double check idiom)双重检查 和 lazy initialization holder class(静态内部类)...

首先这两种方式都是延迟初始化机制&#xff0c;就是当要用到的时候再去初始化。 但是Effective Java书中说过&#xff1a;除非绝对必要&#xff0c;否则就不要这么做。 1. DCL (double checked locking&#xff09;双重检查&#xff1a; 如果出于性能的考虑而需要对实例域(注意…

【golang程序包推荐分享】go-ini、viper、godoc

【golang程序包推荐&分享】go-ini、viper、godoc一、go-ini1.程序包简介2.下载安装3.简单使用【截取自官网】二、viper1.程序包简介2.下载安装3.简单使用三、godoc1.程序包简介2.下载安装3.简单使用一、go-ini 1.程序包简介 ini 是常用的配置文件格式&#xff0c;而go-in…

Request To JavaBean(请求对象转换为JavaBean对象)

背景: 经常要从request等对象取出值来赋入bean中&#xff0c;如果不用MVC框架的绑定功能的话,麻烦 一 参考资料 1 http://jc-dreaming.iteye.com/blog/563893 2 http://www.iteye.com/topic/76043 3 http://xubindehao.iteye.com/blog/754807 4 http://javafenger.iteye.com/b…

在Substance Designer中创建砖墙视频教程

学习在Substance Designer中创建复杂材料的高级技术。 如果你想进入游戏行业&#xff0c;想学习如何创建高质量的纹理和学习物质设计&#xff0c;那么这个课程是给你的。 我设计了这个课程&#xff0c;从一开始就带你&#xff0c;教你我用来创建AAA纹理的3个步骤:图案&#xff…

python requests 动态加载_python requests 高级用法

HTTP动词 Requests 提供了几乎所有HTTP动词的功能&#xff1a;GET、OPTIONS、HEAD、POST、PUT、PATCH、DELETE。以下内容为使用 Requests 中的这些动词以及 Github API 提供了详细示例。 我将从最常使用的动词 GET 开始。HTTP GET 是一个幂等方法&#xff0c;从给定的 URL 返回…

redis配置开机启动

2019独角兽企业重金招聘Python工程师标准>>> 一、下载安装 去http://download.redis.io/releases/现在最新的redis版本解压 tar zxvf xxx.tar.gz编译进入到解压开的目录&#xff0c;执行&#xff1a;make && make install(可选)添加到bin目录cp redis-serve…

Docker exec命令详细使用指南

Docker exec命令是Docker提供的一个强大工具,用于在正在运行的容器中执行命令。本文将详细介绍Docker exec命令的用法和示例,帮助大家更好地理解和使用这个命令。Docker是一种流行的容器化平台,允许我们在容器中运行应用程序。有时候,在容器内执行命令可以帮助我们调试、排查问题或进行其他操作。这就是Docker exec命令发挥作用的时候。本文详细介绍了Docker exec命令的用法和示例。

Docker网络详解

如何自定义一个网络?查看新创键的mynet详细信息:# 创建两个使用相同自定义网络的容器# 测试容器互连^C^C。

Django Python:完整的BUNDLE + Django真实项目2021

Django和python Bundle:从学习python的所有基础知识到高级python再到UI设计TKINTER&#xff0c;然后是Django 你会学到: 学习编程的基础知识 学习Python编程语言 学习Django & Bootstrap框架 为真实世界的Python程序编写代码 用Python创建一个真实世界的网站 学习使用TKIn…

鱼眼相机标定_鱼眼相机模型(二)

前言在介绍其他相机模型之前&#xff0c;可以先看一下kalibr支持标定的相机模型&#xff08;kalibr可以标定的相机模型&#xff09;&#xff0c;这里的相机模型一共有4种&#xff0c;针孔相机模型&#xff0c;全景相机模型&#xff0c;Double sphere相机模型还有EUCM。其中EUCM…

DllImport dll中有些啥函数 及 dll中是否用到了别的dll

在加载dll的时候不知道dll中有哪些接口怎么办&#xff0c;或者使用别人封装的东西时报出类似于“无法在 DLL“XXX.dll”中找到名为“XXX函数”的入口点。”1.通过LordPE这个软件来看dll中都有些啥函数的 打开后看图选择 选择dll继续看图选择继续看图选择 这里就看到有什么函数了…

openharmony开发版应用安装签名

配置签名信息应用/服务在真机设备上运行,需要提前为应用/服务进行签名,DevEco Studio为开发者提供了自动化签名方案,可以一键完成应用/服务签名。具体操作如下:单击File > Project Structure > Project > Signing Configs界面勾选Automatically generate signature,等待自动签名完成即可,单击OK。如下图所示:说明。

基于Golang的对象序列化的程序包开发——myJsonMarshal

基于Golang的对象序列化的程序包开发——myJsonMarshal【阅读时间&#xff1a;约10分钟】一、对象序列化概述二、系统环境&项目介绍1.系统环境2.项目的任务要求三、具体程序设计及Golang代码实现1.程序设计2.JsonMarshal函数3.Marshal函数4.StringTrans函数5.StructTrans函…

【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)

目录【阅读时间&#xff1a;约5分钟】一.概述1.Json的作用2.Go官方 encoding/json 包3. golang json的主要操作二.Json Marshal&#xff1a;将数据编码成json字符串三.Json Unmarshal&#xff1a;将json字符串解码到相应的数据结构四.myJsonMarshal程序包开发的踩坑经历1.go do…

Java数据结构和算法的数组

阵列的功能&#xff1a; 1、固定大小 2、相同的数据类型 3、 4、数据项可反复 Java数据类型&#xff1a;基本类型&#xff08;int和double&#xff09;和对象类型。在很多编程语言中。数组也是基本类型。但在Java中把它们当作对象来对待。因此在创建数组时必须使用new操作符。 …

玻璃和水晶PBR纹理材质预设

CGAxis–物理6–玻璃和水晶PBR纹理材质预设 大小&#xff1a;20.8G 信息: 透明玻璃、彩色玻璃和水晶的100种不同图案和变化的PBR纹理。这个包中的每个纹理由八个贴图组成:漫反射&#xff0c;反射&#xff0c;高度(位移)&#xff0c;光泽度&#xff0c;环境遮挡&#xff0c;金属…

【POJ1113】Wall(凸包)

【题目】 Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall around the Kings castle. The King was so greedy, that he would not listen to his Architects proposals to build a beautiful brick wall with a perfe…

matlab小波分析工具箱原理与应用_补充:频域特征值提取的MATLAB代码实现(小波分析)...

之前的文章信号频域分析方法的理解&#xff08;频谱、能量谱、功率谱、倒频谱、小波分析&#xff09;中提到了离散小波分解的例子&#xff0c;其参考代码如下&#xff1a;t_s 结果如下&#xff1a;原始信号离散小波分析结果左侧四行是1~4阶的近似信号&#xff0c;右侧四行是1~4…

【ReactiveX】基于Golang pmlpml/RxGo程序包的二次开发

基于Golang pmlpml/RxGo程序包的二次开发【阅读时间&#xff1a;约20分钟】一、ReactiveX & RxGo介绍1.ReactiveX2.RxGo二、系统环境&项目介绍1.系统环境2.项目的任务要求三、具体程序设计及Golang代码实现1.程序设计2.filteringOperator数据结构、op函数与newFilterOb…

python dataframe 中位数_python下的Pandas中DataFrame基本操作(一),基本函数整理

pandas作者Wes McKinney 在【PYTHON FOR DATA ANALYSIS】中对pandas的方方面面都有了一个权威简明的入门级的介绍&#xff0c;但在实际使用过程中&#xff0c;我发现书中的内容还只是冰山一角。谈到pandas数据的行更新、表合并等操作&#xff0c;一般用到的方法有concat、join、…