如何利用Python學習linux命令?

  • 2019 年 10 月 11 日
  • 筆記

看過這篇《2000字諫言,給那些想學Python的人,建議收藏後細看!》(http://mp.weixin.qq.com/s?__biz=Mzg4ODE1MjU4Ng==&mid=2247486937&idx=2&sn=ce57ba4a90692f8afadd7547b86c7875&chksm=cffe3abcf889b3aae965421ff0b709e22b4779205e85b75279f7d3221d5a18f3864477798926&scene=21#wechat_redirect)的讀者應該都對一個命令有點印象吧?沒錯,就是 linux 中經常會用到的 ls 命令。

文章中我就提到如何提升自己的 python 能力呢?直接找項目寫,但是作為零基礎 / 小白 / 入門 的你來說做一個部落格還要學 web 框架、html、css、js,又成為了阻礙你寫實際項目的阻礙。

所以我就推薦了這個命令:ls。寫一個 ls 非常簡單,你只需要會一點 linux 的基礎知識,知道 ls 能做什麼就好了。

那今天小金就給大家碼了一個哪哪能用的 ls.py ,沒錯,windows 也可以哦~

演示環境

  • 作業系統:windows10
  • python版本:python 3.7
  • idea:pycharm 2018.2
  • 使用模組:argparse, os

了解argparse模組

argparse是python的標準庫,他可以使我們很友好的編寫命令行介面,並且可以自動生成幫助文檔和使用消息,還能在參數無效的時候發出錯誤。

argparse.ArgumentParse類參數理解

1. prog:改變應用的名字,我們可以使用`%(prog)s`引用應用的名字,默認的應用名字為文件名。

2. usage: 顯示這個命令用法, 一般用來顯示參數的用法

3. description:顯示這個命令的幫助資訊

4. epilog: 顯示命令的幫助資訊,位置在參數的下面

argparse.ArgumentParser.add_argument函數理解

1. name | flags: 指定參數的名字

2. action: 指定命令行參數,內置為以下幾種

– store: 默認值,僅僅保存參數值。

– store_const: 與store基本一致,但是只保存const關鍵字指定的值,其它的值會報錯

– store_true | store_false: 與store_const基本一致,只保存True和False

– append: 將相同參數的不同值保存在一個list中

– count: 統計參數出現的次數

– help: 輸出程式的幫助資訊

– version: 輸出程式版本資訊

3. nargs: 將不同數量的值與一個參數關聯起來

– nargs=N:N為整數

– nargs='?'

– nargs='*': 將所有的參數保存在列表中

– nargs='+': 將所有的參數保存在列表中,但是至少得有一個參數

– nargs=argparse.REMAINDER: 其餘的參數全部保存在一個list中

4. default: 如果沒有傳入這個參數,默認使用default參數的值

5. type: 接收到的參數會經過這個參數對應的函數處理。

6. choices: 將參數指定在一個範圍內,超出就報錯

7. required: 指定參數是否為必傳參數。

8. dest: 自定義參數的名稱,默認名稱為 「- 後面的值」 或者 「– 後面的值」

編寫ls命令腳本

這裡我們就簡單的指定三個參數.

-a: 添加 -a 參數,顯示隱藏文件。

-r: 添加 -r 參數,遞歸顯示文件夾下面的文件。

-d: 指定顯示目錄,如果不指定,默認為當前目錄。

首先我們使用 ArgumentParser 類來指定參數。

import os  import argparse    parser = argparse.ArgumentParser(prog='ls', description='顯示文件夾下的文件')    # 指定參數  parser.add_argument('-a', '--all', const=True, nargs='?', help='是否顯示隱藏文件')  parser.add_argument('-d', '--directory', help='指定顯示的目錄,如果不指定,默認為當前目錄')  parser.add_argument('-r', '--recursion', const=True, nargs='?', help='是否遞歸顯示')    # 解析參數  args = parser.parse_args()    # 拿到directory參數,如果沒有傳這個參數,為None  directory = args.directory  # 如果directory有值  if directory:      # 如果指定目錄不存在,拋出異常      if not os.path.exists(directory):          raise ValueError(f'{directory} does`t exist')        # 如果directory不是一個目錄,拋出異常      if not os.path.isdir(directory):          raise ValueError(f'{directory} is not a directory')    # 如果directory為None,給directory賦值  else:      directory = '.'

我們規定好參數之後,接下來就是具體ls的實現。我們封裝一個 LsCommand 類

class LsCommand():      def __init__(self, show_all=False, directory='.', recursion=False):          '''          :param show_all: 是否顯示隱藏文件          :param directory: 指定的文件目錄          :param recursion: 是否遞歸顯示目錄下的文件          '''          self.show_all = show_all          self.recursion = recursion          self.directory = os.path.abspath(directory)          def handle_dir(self, directory, grade=1, placeholder='--'):          '''          處理目錄          :param directory: 文件目錄          :param grade: 目錄層級          :param placeholder: 子目錄文件前面的佔位符          :return:          '''          # 判斷是否為文件夾            # grade是否增加過了            # os.listdir: 列出當前文件夾下面的所有文件和文件夾          # 遍歷目錄下的文件,文件夾          pass        def show_file_or_dir(self, file, prefix=''):          # 如果不顯示隱藏文件            # 列印前綴和文件名          pass        def run(self):          '''          運行ls命令          :return:          '''          # os.listdir(dir) 得到dir目錄下所有文件,文件夾            # 遍歷self.directory目錄先所有文件,文件夾            pass

ls這個類我們也封裝好了,接下來我們將得到的參數傳入 LsCommand 類中,然後運行,就可以愉快的得出結果。

ls = LsCommand(bool(args.all), directory, bool(args.recursion))  ls.run()

效果展示:

python ls.py

python ls.py -a

python ls.py -a -r

python ls.py -d ./temp

—END—