「 生命完美的答案,無非走過沒有遺憾 ---《天藍》」
錦屏網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),錦屏網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為錦屏上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的錦屏做網(wǎng)站的公司定做!
「如何能夠解析腳本運行命令行選項(位于 sys.argv 中)」
argparse 模塊可被用來解析命令行選項
常用來定義一個腳本的說明文檔,一般我們寫python腳本會通過 if..else 的方式來提供一個腳本說明文檔,python不支持switch。所以很麻煩,其實,我們可以通過 argparse 來編寫說明文檔。
我們來看看怎么執(zhí)行一個python腳本
對于熟悉Linux的小伙伴下面的文檔在熟悉不過了,這個一個標準Linxu軟件包的說明文檔,文檔中定義是軟件包的說明
來看看這個腳本是如何編寫的
為了解析命令行選項, 首先要創(chuàng)建一個 ArgumentParser 實例, 使用 add_argument() 方法聲明你想要支持的選項。在每個 add-argument() 調(diào)用中:
dest 參數(shù)指定解析結(jié)果被指派給屬性的名字。 metavar 參數(shù)被用來生成幫助信息。
action 參數(shù) 指定跟屬性對應(yīng)的處理邏輯,通常的 值為 store , 被用來存儲 某個值 或?qū)?多個參數(shù)值收集到一個列表中 。
nargs 參數(shù)收集 所有剩余的命令行參數(shù)到一個列表中。在本例中它被用來構(gòu)造一個文件名列表
action='store_true' 根據(jù)參數(shù)是否存在來設(shè)置一個位置 Boolean 標志:
action='store' 參數(shù)接受一個單獨值并將其存儲為一個字符串
如果一個都沒有,會提示缺少參數(shù) -p/--pat
choices={'slow', 'fast'}, 參數(shù)說明接受一個值,但是會將其和可能的選擇值做比較,以檢測其合法性:
一旦參數(shù)選項被指定,你就可以執(zhí)行 parser.parse() 方法了。它會處理 sys.argv 的值并返回一個結(jié)果實例。每個參數(shù)值會被設(shè)置成該實例中 add_argument() 方法的 dest 參數(shù)指定的屬性值。
還很多種其他方法解析命令行選項??梢詴謩拥靥幚? sys.argv 或者使用 getopt 模塊 。但是,如果你采用本節(jié)的方式,將會減少很多冗余代碼,底層細節(jié) argparse 模塊 已經(jīng)幫你處理好了。你可能還會碰到使用 optparse 庫解析選項的代碼。盡管 optparse 和 argparse 很像 ,但是后者更先進,因此在新的程序中你應(yīng)該使用它。
「你寫了個腳本,運行時需要一個密碼。此腳本是交互式的,因此不能將密碼在腳本中硬編碼,而是需要彈出一個密碼輸入提示,讓用戶自己輸入?!?/p>
Python 的 getpass 模塊 正是你所需要的。你可以讓你很輕松地彈出密碼輸入提示,并且不會在用戶終端顯示密碼。
代碼中 getpass.getuser() 不會彈出用戶名的輸入提示。它會根據(jù)該 用戶的 shell 環(huán)境 或者會依據(jù) 本地系統(tǒng)的密碼庫 (支持 pwd 模塊的平臺)來使用 當(dāng)前用戶的登錄名
在bash中編寫pytohn腳本接收外部數(shù)據(jù)的方式,一般情況下,對于一般變量,我們用命令行變量的方式比較多(手動的處理 sys.argv ),對于 文件內(nèi)容或者bash命令輸出 直接通過腳本內(nèi)部獲取需要的數(shù)據(jù)。
其實python 腳本也可以用其他方式來接收 傳遞給他的 文件數(shù)據(jù)或者bash命令輸出 ,包括將 命令行的輸出 通過 管道傳遞 給該腳本、 重定向文件到該腳本 ,或在 命令行中傳遞一個文件名 或 文件名列表 給該腳本。
這里通過 Python 內(nèi)置的 fileinput 模塊 ,可以實現(xiàn)重 定向,管道,以文佳輸出 的方式傳遞數(shù)據(jù)到腳本內(nèi)部
使用 fileinput.input() 方法可以獲取當(dāng)前輸入腳本的數(shù)據(jù),腳本里面用一個 FileInput 迭代器接收
文件直接接收
重定向接收
管道方式接收
fileinput.input() 創(chuàng)建并返回一個 FileInput 類的實例,該實例可以被當(dāng)做一個 上下文管理器 使用。因此,整合起來,如果我們要寫一個打印多個文件輸出的腳本,那么我們需要在輸出中包含文件名和行號
「你想執(zhí)行一個外部命令并以 Python 字符串的形式獲取執(zhí)行結(jié)果。」
使用 subprocess.check_output() 函數(shù)。
執(zhí)行下試試
如果被執(zhí)行的命令以非零碼返回,就會拋出異常。下面的例子捕獲到錯誤并獲取返回碼:
默認情況下, check_output() 僅僅返回輸入到標準輸出的值。如果你需要 同時收集標準輸出和錯誤輸出 ,使用 stderr 參數(shù):
如果你需要用一個超時機制來執(zhí)行命令,使用 timeout 參數(shù):
通常來講,命令的執(zhí)行 不需要 使用到 底層 shell 環(huán)境(比如 sh、bash) 。一個字符串列表會被傳遞給一個 低級系統(tǒng)命令 ,比如 os.execve() 。
如果你想讓 命令被一個shell 執(zhí)行 ,傳遞一個字符串參數(shù),并設(shè)置參數(shù) shell=True . 有時候你想要 Python 去執(zhí)行一個復(fù)雜的 shell 命令 的時候這個就很有用了,比如管道流、I/O 重定向和其他特性。例如:
是在 shell 中執(zhí)行命令會存在一定的安全風(fēng)險,特別是當(dāng)參數(shù)來自于用戶輸入時。這時候可以使用 shlex.quote() 函數(shù) 來將參數(shù)正確的用雙引用引起來。
使用 check_output() 函數(shù) 是執(zhí)行 外部命令 并獲取其 返回值 的最簡單方式。但是,如果你需要對 子進程做更復(fù)雜的交互 ,比如給它發(fā)送輸入,你得采用另外一種方法。這時候可直接使用 subprocess.Popen 類。
關(guān)于子進程,簡單來看下
也可以進程列表同協(xié)程結(jié)合的方式。你既可以在子shell中 進行繁重的處理工作,同時也不會讓子shell的I/O受制于終端。
如果直接丟到后臺會自動在終端輸出IO
subprocess 模塊對于依賴 TTY 的外部命令不合適用 。例如,你不能使用它來自動化一個用戶輸入密碼的任務(wù)(比如一個 ssh 會話)。這時候,你需要使用到第三方模塊了,比如基于著名的 expect 家族的工具(pexpect 或類似的)(pexpect可以理解為Linux下的expect的Python封裝、通過pexpect可以實現(xiàn)對ssh、ftp、passwd、telnet等命令行進行自動交互,而無需人工干涉來達到自動化的目的。比如我們可以模擬一個FTP登錄時所有交互,包括輸入主機地址、用戶名、密碼、上傳文件等,待出現(xiàn)異常還可以進行嘗試自動處理。)
「你想向標準錯誤打印一條消息并返回某個非零狀態(tài)碼來終止程序運行」
通過 python 的 raise SystemExit(3) 命令可以主動拋出一個錯誤,通過 sys.stderr.write 將命令寫到標準的輸出端
直接將消息作為參數(shù)傳給 SystemExit() ,那么你可以省略其他步驟
拋出一個 SystemExit 異常,使用錯誤消息作為參數(shù),它會將消息在 sys.stderr 中打印,然后程序以狀態(tài)碼 1 退出
「你需要知道當(dāng)前終端的大小以便正確的格式化輸出?!?/p>
使用 os.get terminal size() 函數(shù) 來做到這一點。
「復(fù)制或移動文件和目錄,但是又不想調(diào)用 shell 命令?!?/p>
shutil 模塊 有很多便捷的函數(shù)可以復(fù)制文件和目錄。使用起來非常簡單
這里不多講,熟悉Linux的小伙伴應(yīng)該不陌生。
默認情況下,對于 符號鏈接 這些命令處理的是它指向的東西文件。例如,如果 源文件 是一個 符號鏈接 ,那么目標文件將會是 符號鏈接 指向的文件。如果你只想 復(fù)制符號鏈接本身 ,那么需要指定 關(guān)鍵字 參數(shù) follow_symlinks
copytree() 可以讓你在復(fù)制過程中選擇性的忽略某些文件或目錄。你可以提供一個忽略函數(shù),接受一個目錄名和文件名列表作為輸入,返回一個忽略的名稱列表。例如:
對于文件元數(shù)據(jù)信息, copy2() 這樣的函數(shù)只能盡自己最大能力來保留它。 訪問時間、創(chuàng)建時間和權(quán)限 這些基本信息會被保留,但是 對于所有者、ACLs、資源 fork 和其他更深層次的文件元信息就說不準了
通常不會去使用 shutil.copytree() 函數(shù) 來執(zhí)行 系統(tǒng)備份 。當(dāng)處理文件名的時候,最好使用 os.path 中的函數(shù)來確保最大的可移植性
使用 copytree() 復(fù)制文件夾的一個棘手的問題是對于錯誤的處理,可以使用異常塊處理,或者通過 參數(shù) ignore dangling symlinks=True 忽略掉無效符號鏈接。
「創(chuàng)建或解壓常見格式的歸檔文件(比如.tar, .tgz 或.zip)」
shutil 模塊擁有兩個函數(shù)—— make archive() 和 unpack archive() 可派上用場,
make archive() 的第二個參數(shù)是期望的輸出格式??梢允褂?get archive formats() 獲取所有支持的歸檔格式列表。
「你需要寫一個涉及到文件查找操作的腳本,比如對日志歸檔文件的重命名工具,你不想在 Python 腳本中調(diào)用 shell,或者你要實現(xiàn)一些 shell 不能做的功能?!?/p>
查找文件,可使用 os.walk() 函數(shù) ,傳一個頂級目錄名給它
os.walk() 方法 為我們 遍歷目錄樹 ,每次進入一個目錄,它會返回一個 三元組 ,包含 相對于查找目錄的相對路徑,一個該目錄下的目錄名列表,以及那個目錄下面的文件名列表。
對于每個元組,只需檢測一下目標文件名是否在文件列表中。如果是就使用 os.path.join() 合并路徑。為了避免奇怪的路徑名比如 ././foo//bar ,使用了另外兩個函數(shù)來修正結(jié)果
os.walk(start) 還有跨平臺的優(yōu)勢。并且,還能很輕松的加入其他的功能。我們再演示一個例子,下面的函數(shù)打印所有最近被修改過的文件:
打印10分鐘之前被修改的數(shù)據(jù)
「怎樣讀取普通.ini 格式的配置文件?」
configparser 模塊 能被用來讀取配置文件
編寫配置文件
如果有需要,你還能修改配置并使用 cfg.write() 方法將其寫回到文件中
「你希望在腳本和程序中將診斷信息寫入日志文件?!?/p>
python 腳本打印日志最簡單方式是使用 logging 模塊
五個日志調(diào)用( critical(), error(), warning(), info(), debug() )以降序方式表示不同的嚴重級別。 basicConfig() 的 level 參數(shù)是一個 過濾器 。所有級別低于此級別的日志消息都會被忽略掉。每個 logging 操作的參數(shù)是一個消息字符串,后面再跟一個或多個參數(shù)。構(gòu)造最終的日志消息的時候我們使用了 % 操作符來格式化消息字符串。
如果你想使用配置文件,可以像下面這樣修改 basicConfig() 調(diào)用:
logconfig.ini
在調(diào)用日志操作前先執(zhí)行下 basicConfig() 函數(shù)方法 ,可以找標準輸出或者文件中輸出
basicConfig() 在程序中只能被執(zhí)行一次。如果你稍后想改變?nèi)罩九渲?,就需要先獲取 root logger ,然后直接修改它。
更多見日志模塊文檔
「你想給某個函數(shù)庫增加日志功能,但是又不能影響到那些不使用日志功能的程序?!?/p>
對于想要執(zhí)行日志操作的函數(shù)庫,你應(yīng)該創(chuàng)建一個專屬的 logger 對象,并且像下面這樣初始化配置:
使用這個配置,默認情況下不會打印日志,只有配置過日志系統(tǒng),那么日志消息打印就開始生效
通常來講,不應(yīng)該在函數(shù)庫代碼中 自己配置日志系統(tǒng) ,或者是已經(jīng)有個已經(jīng)存在的日志配置了。調(diào)用 getLogger( name ) 創(chuàng)建一個和調(diào)用模塊同名的 logger 模塊 。由于 模塊 都是唯一的,因此創(chuàng)建的 logger 也將是唯一 的。所以當(dāng)前進程中只有一個logging會生效。
log.addHandler(logging.NullHandler()) 操作將一個 空處理器 綁定到剛剛已經(jīng)創(chuàng)建好的 logger 對象 上。一個空處理器默認會忽略調(diào)用所有的日志消息。因此,如果使用該函數(shù)庫的時候還沒有配置日志,那么將不會有消息或警告出現(xiàn)。
在這里,根日志被配置成僅僅 輸出 ERROR 或更高級別的消息 。不過, somelib 的日志級別被單獨配置成可以輸出 debug 級別的消息, 它的優(yōu)先級比全局配置高。像這樣更改單獨模塊的日志配置對于調(diào)試來講是很方便的,因為你無需去更改任何的全局日志配置——只需要修改你想要更多輸出的模塊的日志等級。(這個還有待研究)
「你想記錄程序執(zhí)行多個任務(wù)所花費的時間」
time 模塊 包含很多函數(shù)來執(zhí)行跟時間有關(guān)的函數(shù)。盡管如此,通常我們會在此基礎(chǔ)之上構(gòu)造一個更高級的接口來模擬一個計時器。
這個類定義了一個可以被用戶根據(jù)需要啟動、停止和重置的計時器。它會在elapsed 屬性中記錄整個消耗時間。下面是一個例子來演示怎樣使用它:
這里通過 __enter__,__exit__ ,使用 with 語句 以及上下文管理器協(xié)議可以省略計時器打開和關(guān)閉操作。(關(guān)于上下文管理協(xié)議,即with語句,為了讓一個對象兼容with語句,必須在這個對象的類中聲明 __enter__和__exit__方法, , __enter__ 在出現(xiàn)with語句被調(diào)用, __exit__ 在代碼執(zhí)行完畢被調(diào)用,可以參考open()方法)
在計時中要考慮一個 底層的時間函數(shù)問題 。 一般來說, 使用 time.time() 或 time.clock() 計算的時間精度因操作系統(tǒng)的不同會有所不同。而使用 time.perf_counter() 函數(shù)可以確保使用系統(tǒng)上面 最精確的計時器 。
「你想對在 Unix 系統(tǒng)上面運行的程序設(shè)置內(nèi)存或 CPU 的使用限制?!?/p>
resource 模塊 能同時執(zhí)行這兩個任務(wù)。例如,要限制 CPU 時間,下面的代碼在windows平臺執(zhí)行不了,但是Linux是可以的。
程序運行時, SIGXCPU 信號 在時間過期時被生成,然后執(zhí)行清理并退出。
這暫時沒有好的Demo...
程序運行到?jīng)]有多余內(nèi)存時會拋出 MemoryError 異常。
setrlimit() 函數(shù) 被用來設(shè)置特定資源上面的 軟限制和硬限制 。
setrlimit() 函數(shù) 還能被用來設(shè)置 子進程數(shù)量、打開文件數(shù)以及類似系統(tǒng)資源的限制(cgroup) 。
「通過腳本啟動瀏覽器并打開指定的 URL 網(wǎng)頁」
webbrowser 模塊 能被用來啟動一個瀏覽器,并且與平臺無關(guān)
新窗口打卡網(wǎng)站
當(dāng)前窗口打開一個tab頁
指定瀏覽器類型,可以使用 webbrowser.get() 函數(shù)
在Linux環(huán)境下編寫python腳本
相關(guān)推薦:《Python教程》
1、首先定位到一個文件夾,然后使用vim編輯器:vim test.py 就創(chuàng)建了python腳本文件,并且進入編輯狀態(tài)。
2、編輯好之后按Esc鍵切換到命令模式,然后輸入:wq,按回車鍵就自動保存完成了,然后輸入python test.py,即可運行程序(前提是linux環(huán)境裝好python)。
#!/bin/bash
eval?"cd?/export/songhongwei/code"
eval?"cd?/export/songhongwei/data"
echo?"上面兩行就是在.shell書寫linux命令的方式"
備注:
語法:eval?cmdLine
eval會對后面的cmdLine進行兩遍掃描,如果第一遍掃描后,cmdLine是個普通命令,則執(zhí)行此命令;如果cmdLine中含有變量的間接引用,則保證間接引用的語義。
Shell?的?echo?指令與?PHP?的?echo?指令類似,都是用于字符串的輸出。
步驟:
1.新建一個.sh文件,touch test.sh
2.
編輯test.sh文件,vi test.sh
然后鍵入i,輸入內(nèi)容,
#!/bin/sh必須放在第一行
如圖MongoDB的啟動命令
然后鍵入esc
鍵入:wq保存退出
3.給test.sh賦予可執(zhí)行權(quán)限,chmod +x test.sh
4.執(zhí)行腳本./test.sh,即可執(zhí)行腳本
5.也可以通過sh test.sh 執(zhí)行腳本
擴展資料:
Linux是一套免費使用和自由傳播的類Unix操作系統(tǒng),是一個基于POSIX和UNIX的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。它能運行主要的UNIX工具軟件、應(yīng)用程序和網(wǎng)絡(luò)協(xié)議。它支持32位和64位硬件。Linux繼承了Unix以網(wǎng)絡(luò)為核心的設(shè)計思想,是一個性能穩(wěn)定的多用戶網(wǎng)絡(luò)操作系統(tǒng)。
Linux操作系統(tǒng)誕生于1991 年10 月5 日(這是第一次正式向外公布時間)。Linux存在著許多不同的Linux版本,但它們都使用了Linux內(nèi)核。Linux可安裝在各種計算機硬件設(shè)備中,比如手機、平板電腦、路由器、視頻游戲控制臺、臺式計算機、大型機和超級計算機。
嚴格來講,Linux這個詞本身只表示Linux內(nèi)核,但實際上人們已經(jīng)習(xí)慣了用Linux來形容整個基于Linux內(nèi)核,并且使用GNU?工程各種工具和數(shù)據(jù)庫的操作系統(tǒng)。
腳本(Script)是使用一種特定的描述性語言,依據(jù)一定的格式編寫的可執(zhí)行文件,又稱作宏或批處理文件。
Linux系統(tǒng)的shell作為操作系統(tǒng)的外殼,為用戶提供使用操作系統(tǒng)的接口。它是命令語言、命令解釋程序及程序設(shè)計語言的統(tǒng)稱。
shell是用戶和Linux內(nèi)核之間的接口程序,如果把Linux內(nèi)核想象成一個球體的中心,shell就是圍繞內(nèi)核的外層。當(dāng)從shell或其他程序向Linux傳遞命令時,內(nèi)核會做出相應(yīng)的反應(yīng)。
shell是一個命令語言解釋器,它擁有自己內(nèi)建的shell命令集,shell也能被系統(tǒng)中其他應(yīng)用程序所調(diào)用。用戶在提示符下輸入的命令都由shell先解釋然后傳給Linux核心。
參考資料:百度百科 運行腳本
當(dāng)前題目:linux編寫腳本命令行 linux編寫腳本文件
網(wǎng)頁URL:http://jinyejixie.com/article26/dopssjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、手機網(wǎng)站建設(shè)、移動網(wǎng)站建設(shè)、網(wǎng)站設(shè)計公司、網(wǎng)站設(shè)計、App設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)