【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()
發佈了97 篇原創文章 · 獲贊 12 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章