使用argparse封装python程序为命令行工具
小规模的python代码,jupyter cell中直接运行,相当于该py文件直接python运行,但是像shell脚本一样,给予参数自由度设置,更方便分析,也就是我们需要传入参数进行重复性、同质性的操作。
Q:如何使用argparse将Python程序封装为可调用的命令行工具?
比如说我有一个函数,各个模块我已经写好了,这里引用一下我之前上统计学习课的时候举的一个HMM的例子,
简单来说,就是一阶HMM用于隐状态序列分析,
然后我所有上游的函数处理逻辑都捋顺了,所有已经写好的函数子模块都在这个最后的函数中调用,所以我如果将这整个代码文件改造成一个命令行工具,那么参数就只是上面这个函数的参数:
我的草稿代码如下:
# 开头部分
import argparse # 用于解析命令行参数
可以看到,就导入一个模块即可(至于封装的函数需要导入的模块看自己代码决定,五花八门都有)
# 结尾部分
if __name__ == "__main__":parser = argparse.ArgumentParser(description="为输入的蛋白质家族蛋序列建立多隐状态信号的1阶HMM模型")parser.add_argument("--fasta_file", type=str, help="需要输入的蛋白质家族的fasta序列文件路径")parser.add_argument("--n_states", type=int,default=3, help="隐状态编码个数,默认为3")parser.add_argument("--n_fits", type=int, default=1000, help="baum-welch算法中HMM模型拟合次数,默认为1000")parser.add_argument("--iter_n", type=int, default=100, help="baum-welch算法的最大迭代次数,默认为100,每次初始化的模型都要迭代该次数")parser.add_argument("--best_model_filename", type=str, help="最优HMM模型的保存文件名,建议是pkl格式文件,方便后续加载使用")args = parser.parse_args()first_order_HMM_model(args.fasta_file, args.best_model_filename, args.n_states, args.n_fits, args.iter_n)
if __name__ == "__main__":
这个写法其实就很常见了:
如果是直接运行该脚本文件,则执行以下代码;如果是作为模块导入,则不执行以下代码。
比如说这是一个文件module1.py,如果直接运行python3 module1.py,那么这一行后面的代码会被执行;如果我是在另外一个py中import module1,那么在实际运行的时候,涉及到这一部分代码,因为是作为模块导入,并不是直接运行,所以不会执行后面的代码。
我的草稿效果如下:
总之,这一部分抽象出结构来,其实就是:
# 开头
import argparse # 结尾
if __name__ == "__main__":parser = argparse.ArgumentParser(description="该python命令行工具的帮助文档说明")parser.add_argument("--参数xx", type=指定参数数据类型,default=如果没有显式提供参数时默认值, help="对该参数的帮助文档说明")# 参数xx可以有多个args = parser.parse_args()要运行的主函数(args.参数xx) # 对应上面的参数xx