【Python模塊】命令行解析--argparse


python命令行解析

前言

當你還在使用

if len(sys.argv) > 1

這樣的方式判斷選項和參數的時候,是否已意識到已經落伍了。

我在bash中用過getopt getopts,我用完之后,就再也不記得他們,需要的時候又抄襲過來。
在perl中有好很多的模塊GetOpt::Std,GetOpt::Long

python也有getopt的模塊,按照c的風格使用。

我們跳過這里,直接進入更強大的階段optparse,一種更友好的面向對象的方式,至少不需要getopt之后,進行一系列的if elif的判斷。

隨着模塊的發展,最終argparse替換了它,詳細原因可以參考PEP0389

學習

過一下手冊,HOWTO,最終自己練習一下,來記住這個模塊。

HOWTO

HOWTO比較簡單,掌握了基本的用法。還有一些參數太多,不太常用的,可以慢慢摸索。看一下標准庫第一個例子,查詢一下里面幾個參數。

標准庫

練習

寫一個自己的需求的程序,比較簡單

需要

選項
-s 或者–safe 不帶參數,變量為true或false;判斷是否執行刪除操作

-o 或者–output 參數為可寫文件,如果沒有參數,就默認生成一個tmp目錄下的文件

參數
dir , 表示一個目錄,缺省值為當前目錄 .


import argparse

parser = argparse.Argumentparser(description="This is a de-duplicate tool")

parser.add_argument("dir",default=".",
help="target directory")
parser.add_argument("-s","--safe","--scan",
action="store_true",dest="not_delete",
help="scan directory only ,don't delete file")
parser.add_argument("-o","--output",type=FileType("w"),
default=generate_tmp())
args = parser.parse_args()

print "Dir:{}".format(args.dir)
if args.not_delete:
print "we are in safe mode."
print "output file:%s".format(args.output.name)

在txt上寫好了
1.發現Argumentparser這個拼寫錯了,這個居然是駝峰的風格。
2.發現python 有生成零時文件的函數。
3.FileType這個是argparse里的方法
fix it


import argparse
import os

parser = argparse.ArgumentParser(description="This is a de-duplicate tool")

parser.add_argument("dir",default=".",
help="target directory")
parser.add_argument("-s","--safe","--scan",
action="store_true",dest="not_delete",
help="scan directory only ,don't delete file")
parser.add_argument("-o","--output",type=argparse.FileType("w"),
default=os.tmpfile())
args = parser.parse_args()

print "Dir:{}".format(args.dir)
if args.not_delete:
print "we are in safe mode."
print "output file:%s".format(args.output.name)

發現os.tmpfile不會返回路徑,文件描述符消失時,自動刪除文件

重找 tempfile 模塊,這個模塊居然也有坑,不是一個文件描述符,是操作系統描述符。好大一個

可以-o的默認參數改成None,做一些處理,獲得需要的文件路徑和文件描述符,形成統一。

import argparse
import os
import tempfile

parser = argparse.ArgumentParser(description="This is a de-duplicate tool")

parser.add_argument("dir",default=".",
help="target directory")
parser.add_argument("-s","--safe","--scan",
action="store_true",dest="not_delete",
help="scan directory only ,don't delete file")
parser.add_argument("-o","--output",type=argparse.FileType("w"),
help="output of scan result")
args = parser.parse_args()

print "Dir:{}".format(args.dir)
if args.not_delete:
print "we are in safe mode."

output_fifo=""
output_filename=""
if args.output:
output_fifo=args.output
output_filename=args.output.name
else:
fd, output_filename=tempfile.mkstemp(prefix="dedu-",suffix=".log")
output_fifo=os.fdopen(fd,"w")

print "output file:{}".format(output_filename)
output_fifo.close()

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: