日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux系统下用python写程序,用Python写个Linux系统命令

發布時間:2025/3/21 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux系统下用python写程序,用Python写个Linux系统命令 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這篇文章介紹如何寫個系統命令以及我為什么要寫命令

“一切皆文件”是linux的基本哲學之一,我們在linux下執行的諸如ls

之類的命令實際上都是去執行了系統上的某個文件,which

命令可以查看到我們執行的命令對應的是系統上的哪個文件,例如常用的ls

命令實際上就是執行了/bin/ls

這個文件root@ops-coffee:~#?which?ls/bin/ls

基于此,我們就知道了定義一個命令很簡單,只需要寫個可執行的文件就行了,python的標準模塊argparse

就可以幫助我們快速方便的構建一個用戶友好的命令

argparse

相比于自己實現個命令文件,argparse

模塊能夠自動生成幫助和使用手冊,并在用戶傳入無效參數時報錯。一個簡單的示例如下#!/usr/bin/env?python3#?coding:utf8import?argparseparser?=?argparse.ArgumentParser(description='整數處理')parser.add_argument('integers',?type=int,?help='要處理整數')args?=?parser.parse_args()print(args.integers)

這個示例的意思是接收一個數字,并將這個數字輸出,接下來看一下詳細的解釋

首先創建了一個ArgumentParser

對象,ArgumentParser

對象有很多參數可以選擇,這里的description

定義在參數幫助文檔之前顯示的文本,通常用來定義這個程序做什么以及怎么做parser?=?argparse.ArgumentParser(description='整數處理')

然后通過add_argument

給ArgumentParser

對象添加參數,第一個參數integers

為參數名,type

指定類型為int

,help

指定這個字段的幫助信息parser.add_argument('integers',?type=int,?help='要處理的整數')

通過調用ArgumentParser

對象的parse_args

方法返回一個具有所有參數屬性的對象args?=?parser.parse_args()

最后通過args.參數名

獲取到傳入的參數值print(args.integers)

執行

我們將以上文件命名為opscoffee

,并賦予執行權限,放在系統環境變量/bin

下,就可以當作命令直接執行了#?chmod?+x?opscoffee#?mv?opscoffee?/bin/

如果直接執行opscoffee

命令的話將會收到一個報錯,提示你必須有一個參數integers#?opscoffeeusage:?opscoffee?[-h]?integersopscoffee:?error:?the?following?arguments?are?required:?integers

同時也通過usage

告訴了你這個命令的用法,默認有一個-h

參數可以打印命令幫助#?opscoffee?-husage:?opscoffee?[-h]?integers整數處理positional?arguments:? integers ???要處理的整數optional?arguments:??-h,?--help??show?this?help?message?and?exit

這就是使用argparse

模塊的好處,自動生成幫助,提供友好的使用體驗

參數

argparse

能實現的遠不止于此,還有更加強大的功能,主要在于add_argument

方法參數的運用,以下以一些例子來學習下一些常用的參數

可選參數

當我們在參數名前添加-

或者--

時,argparse

會默認認為這是一個可選參數,可以不傳值,例如parser.add_argument('--age',?type=int,?help='年齡')

可選參數當沒有傳值時的默認值為None

,可以通過default

來設置默認值parser.add_argument('--age',?type=int,?default=37,?help='年齡')

當沒有參數--age

時,顯示default

設置的值(沒有設置default

則顯示None),有--age

則顯示--age

指定的值#?opscoffee37#?opscoffee?--age?3838

如果你想讓可選參數也變成必選的,則只需要設置required=True

即可parser.add_argument('--age',?type=int,?default=37,?required=True,?help='年齡')

type

type

用來指定參數的類型,允許任何類型檢查和類型轉換,例如str

、int

、float

、open

甚至是你自定義的方法都可以。#!/usr/bin/env?python3#?coding:utf8import?argparsedef?even(string):????value=?int(string)????if?value%2!=0:????????msg?=?"%r?不是偶數"?%?string????????raise?argparse.ArgumentTypeError(msg)????return?valueparser?=?argparse.ArgumentParser(description='整數處理')parser.add_argument('integers',?type=even,?help='要處理的整數')args?=?parser.parse_args()print(args.integers)

以上命令接收一個參數integers

,并將其type

設置為了自定義方法even

,這個方法會判斷用戶輸入的數字是否是偶數,如果不是則報錯,執行結果如下#?opscoffee?1usage:?opscoffee?[-h]?integersopscoffee:?error:?argument?integers:?'1'?不是偶數#?opscoffee?22

choices

choices

參數可以限制參數的范圍,例如我們只想讓用戶從ops

或coffee

兩個參數中選擇一個輸入,則可以這樣用parser.add_argument('site',?choices=['ops','coffee'],?help='Site')

那么當我們輸入的內容不是ops

或coffee

時,則報錯#?opscoffee?cnusage:?opscoffee?[-h]?{ops,coffee}opscoffee:?error:?argument?site:?invalid?choice:?'cn'?(choose?from?'ops',?'coffee')

nargs

通常我們在argparse

中定義的參數數量與傳入的參數數量應當相等,但有些時候我們需要接收未知數量的參數,nargs

就可以幫助我們

nargs支持以下值:N

(整數)、'?'

、'*'

、'+'

、argarse.REMAINDER

N: 表示N個參數會被聚集到一個列表中,例如import?argparseparser?=?argparse.ArgumentParser(description='整數處理')parser.add_argument('integers',?type=int,?nargs=2,?help='要處理的整數')args?=?parser.parse_args()print(args.integers)

將輸出#?opscoffee?9?10[9,?10]

'?': 表示使用一個或不使用參數,當不傳參數時,默認為Noneparser.add_argument('integers',?type=int,?nargs='?',?help='要處理的整數')

'*': 表示使用所有參數,參數個數可以為0parser.add_argument('integers',?type=int,?nargs='*',?help='要處理的整數')

'+': 與'*'

類似,但至少要有一個參數,否則將會報錯parser.add_argument('integers',?type=int,?nargs='+',?help='要處理的整數')

自定義命令

先說我為什么要寫個系統命令?

文章『Probius:一個功能強大的自定義任務系統』中介紹了我們的自定義任務系統,這個系統可以用來編排任務,而在編排CICD任務中會用到配置文件,我們的配置文件都是通過Kerrigan配置中心來管理的,目前獲取配置中心的配置主要有兩種方法

1. ?配合confd服務自動拉取更新,詳細內容可以查看這篇文章:中小團隊落地配置中心詳解

2.? 配置中心提供API,可以通過API獲取配置內容

腳本里如果想要使用配置中心的配置,則只能通過API的方式去獲取,這樣就要在每個需要用到配置的地方寫一段代碼來獲取及處理,不僅會出現大量的重復代碼,并且非常的不優雅,更為重要的是請求API的Token將會出現在腳本里,帶來一定的安全風險

基于以上考慮,寫個自定義命令來做這件事情更為妥當,于是便寫了下邊這個命令#!/usr/bin/env?python3#?coding:utf8#?這是一個系統命令用來獲取kerrigan配置中心的配置并寫入本地文件,需要將此文件copy到目錄/bin下import?sysimport?argparseimport?requestsparser?=?argparse.ArgumentParser(description='獲取配置中心Kerrigan配置')parser.add_argument('configkey',?type=str,?help='配置中心中文件的Key')parser.add_argument('localfile',?type=str,?help='保存到本地文件的路徑')args?=?parser.parse_args()#?獲得傳入的參數configkey?=?args.configkeylocalfile?=?args.localfileheader?=?{????'Authorization':?'Token?eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.JTdCJTIyZXhwJTIyJTNBMTkwNjcwNzAyMCUyQyUyMmlhdCUyMiUzQTE1OTEzNDcwMjAlMkMlMjJkYXRhJTIyJTNBJTdCJTIydXNlcm5hbWUlMjIlM0ElMjJwcm9iaXVzQG9wcy1jb2ZmZWUuY24lMjIlN0QlN0Q.ops1ZNhq19XSEL2PUo-iQqzbhimDnpFiYc_7EUXftF4'}uri?=?'http://kerrigan.ops-coffee.cn/api/config/?key='?+?configkeyr?=?requests.get(uri,?headers=header)if?r.json()['state']:????content?=?r.json()['message']['content']????try:????????with?open(localfile,?'w')?as?f:????????????f.write(content)????????sys.exit(0)????except?Exception?as?e:????????print('write?local?file?failed:?',?str(e))????????sys.exit(3)else:????print('get?config?failed:?',?r.json()['message'])????sys.exit(1)

以上代碼的意思是根據傳入的key和file路徑,去配置中心獲取對應配置文件的內容并寫入到本地file中。需要注意的是exit

,返回合適的退出狀態是個很好的習慣,這樣我們就可以通過$?

來獲取命令執行成功還是失敗

將此文件命名為getconfig并移動到/bin目錄下添加執行權限,就可以在系統任何地方使用getconfig

命令了# getconfig?/conf/coffee/prod/docker/Dockerfile??/home/project/coffee/Dockerfile

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Linux系统下用python写程序,用Python写个Linux系统命令的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。