Python 命令行傳參

Python 命令行傳參

說到 python 命令行傳參,可能大部分人的第一反應就是用 argparse。的確,argparse 在我們需要指定多個預設的參數(如深度學習中指定模型的超參數等)時,是非常有用的。但是如果有時我們只需要一個參數,那么再解析一整套 argparse 稍顯笨重。本文除了介紹 argparse 之外,也會介紹一些簡單輕便的命令行傳參方法。

sys

我們在學習 C/C++ 時知道主函數 main 需要傳入三個參數:

int main(int argc, char* argv[], char* env[]) {}

其中第三個參數是環境變量,大部分時候我們不寫在程序里,即一般有:

int main(int argc, char* argv[]) {}

關于這幾個參數包括環境變量參數更深入的解釋可參考:Linux中 C++ main函數參數argc和argv含義及用法、12 [虛擬化] 進程抽象;fork,execve,exit

簡單來說,這里的 argc 和 argv 分別是傳入參數的個數,和傳入的參數列表。這里傳入的參數,就是可以在命令行中傳遞的。

在 python 中,我們當然同樣可以用這種方式來傳遞命令行參數,這里我們需要借助內置的 sys 庫。

直接上代碼:

import sysprint(f'參數個數:{len(sys.argv)}')
print(f'參數列表:{str(sys.argv)}')

然后我們在命令行運行,并傳入幾個參數:

python test.py arg1 arg2

輸出為:

參數個數:3
參數列表:['test.py', 'arg1', 'arg2']

注意這里沒有所謂的 sys.argc,而是通過取參數列表的長度來獲得參數的個數 len(sys.argv)。

這種方式獲取幾個命令行參數有時是非常方便的。比如有時我們寫了一個腳本,要將目標檢測數據集中某一張圖像的檢測框畫出來查看,但是想要每次查看不同的圖像。就可以通過這種方式在運行腳本時通過命令行傳參。

# draw_box.py
import sysdef draw_box(image_name):# ...passif __name__ == "__main__":draw_box(sys.argv[1])

這樣在運行時直接在命令行中:

python draw_box.py 12345.jpg

getopt 模塊

getopt模塊是專門處理命令行參數的模塊,用于獲取命令行選項和參數,也就是sys.argv。命令行選項使得程序的參數更加靈活。支持短選項模式 - 和長選項模式

該模塊提供了兩個方法及一個異常處理來解析命令行參數。

getopt.getopt 方法

getopt.getopt 方法用于解析命令行參數列表,語法格式如下:

getopt.getopt(args, options[, long_options])

方法參數說明:

  • args: 要解析的命令行參數列表。
  • options : 以字符串的格式定義,options 后的冒號 : 表示如果設置該選項,必須有附加的參數,否則就不附加參數。
  • long_options : 以列表的格式定義,long_options 后的等號 = 表示該選項必須有附加的參數,不帶等號表示該選項不附加參數。
  • 該方法返回值由兩個元素組成: 第一個是 (option, value) 元組的列表。 第二個是參數列表,包含那些沒有 - 的參數。

另外一個方法是 getopt.gnu_getopt,這里不多做介紹。

Exception getopt.GetoptError

在沒有找到參數列表,或選項的需要的參數為空時會觸發該異常。

異常的參數是一個字符串,表示錯誤的原因。屬性 msgopt 為相關選項的錯誤信息。

argparse

最后是大家最熟悉的 argparse,由于它功能強大且復雜,這里就介紹幾個最常用的方式。

# test_argparse.py
import argparseparser.add_argument('--representation_size', type=int, default=768)
parser.add_argument('--batchSize', type=int, default=32, help='batch size')
parser.add_argument('--epochs', type=int, default=100, help='epochs')
parser.add_argument('--num_workers', type=int, default=20, help='num workers')
parser.add_argument('--tbx', default='debug', help='the name of dir to store data for tensorboard')
parser.add_argument('--gpu_id', default='0', help='gpu id')
parser.add_argument('--load_path', type=str, default='')
parser.add_argument('--lr', type=float, default=5e-3, help='learning rate')
parser.add_argument('--lr_decay', type=float, default=1., help='gamma of learning rate decay')
parser.add_argument('--p', type=float, default=0.75, help='p of drop out')parser.add_argument('--freeze-features', action="store_true")args = parser.parse_args()
print(args.accumulate(args.integers))

在導入 argparse 之后分以下幾步:

  1. 先建立一個 parser 對象
  2. 然后通過 add_argument 加入所需要的參數
  3. 最后通過調用 parser 對象的 parse_args 方法來將參數解析,并賦值給 args

之后就可使用添加的參數(如 args.integer)了。

在命令行傳參時需:

python test_argparse.py --batchSize 64 --num_workers 12 --freeze-features

若未傳參,則按照設置的 default 賦值。

Ref:

https://www.runoob.com/python/python-command-line-arguments.html

https://docs.python.org/zh-cn/3/library/argparse.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532654.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532654.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532654.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

快速排序 C++

快速排序 C 本文圖示借鑒自清華大學鄧俊輝老師數據結構課程。 快速排序的思想 快速排序是分治思想的典型應用。該排序算法可以原地實現,即空間復雜度為 O(1)O(1)O(1),而時間復雜度為 O(nlogn)O(nlogn)O(nlogn) 。 算法將待排序的序列 SSS 分為兩個子…

Linux命令行下感嘆號的幾個用法

Linux命令行下 " ! " 的幾個用法 ! 在大多數編程語言中表示取反的意思,但是在命令行中,他還有一些其他的神奇用法。熟練掌握這些用法,可以大大提高我們日常命令行操作的效率。 1 執行歷史命令 !! ! 在命令行中可以用來執行歷史…

三地址碼簡介

三地址碼簡介 三地址碼(Three Address Code)是一種最常用的中間語言,編譯器可以通過它來改進代碼轉換效率。每個三地址碼指令,都可以被分解為一個四元組(4-tuple)的形式:(運算符&am…

llvm與gcc

llvm與gcc llvm 是一個編譯器,也是一個編譯器架構,是一系列編譯工具,也是一個編譯器工具鏈,開源 C11 實現。 gcc 相對于 clang 的優勢: gcc 支持更過語言前端,如 Java, Ada, FORTRAN, Go等gcc 支持更多地 …

攻防世界web新手區解題 view_source / robots / backup

1**. view_source** 題目描述:X老師讓小寧同學查看一個網頁的源代碼,但小寧同學發現鼠標右鍵好像不管用了。 f12查看源碼即可發現flag 2. robots 題目描述:X老師上課講了Robots協議,小寧同學卻上課打了瞌睡,趕緊來教教…

python參數傳遞*args和**kwargs

python參數傳遞*args和**kwargs 和* 實際上真正的Python參數傳遞語法是 * 和 ** 。*args 和 **kwargs 只是一種約定俗成的編程實踐。我們也可以寫成 *vars 和 **kvars 。就如同其他常規變量的命名一樣, args 和 kwargs 只是一種習慣的名稱。 *args 和 **kwargs 一…

聽GPT 講Rust源代碼--src/tools(25)

File: rust/src/tools/clippy/clippy_lints/src/methods/suspicious_command_arg_space.rs 在Rust源代碼中,suspicious_command_arg_space.rs文件位于clippy_lints工具包的methods目錄下,用于實現Clippy lint SUSPICIOUS_COMMAND_ARG_SPACE。 Clippy是Ru…

Java一次編譯,到處運行是如何實現的

Java一次編譯,到處運行是如何實現的 轉自:https://cloud.tencent.com/developer/article/1415194 (排版微調) JAVA編譯運行總覽 Java是一種高級語言,要讓計算機執行你撰寫的Java程序,也得通過編譯程序的…

JIT(動態編譯)和AOT(靜態編譯)編譯技術比較

JIT(動態編譯)和AOT(靜態編譯)編譯技術比較 轉自:https://www.cnblogs.com/tinytiny/p/3200448.html Java 應用程序的性能經常成為開發社區中的討論熱點。因為該語言的設計初衷是使用解釋的方式支持應用程序的可移植…

python解釋器

python解釋器 計算機編程語言 本部分參考自:https://zhuanlan.zhihu.com/p/141212114 從計算機編程語言說起,它主要分為三類:機器語言、匯編語言、高級語言。 機器語言是一種計算機可以直接識別并執行的二進制指令集。由于其可以直接交給…

編譯型語言與解釋型語言

編譯型語言與解釋型語言 首先要說明,編譯型語言與解釋型語言這種分類方法是不科學的,或者說已經過時了,但是這種稱呼大抵還是能夠讓人明白我們將要討論的是什么東西。 文中所列參考是筆者認為比較有幫助的一些擴展閱讀內容。 首先貼一個很形…

常見的各種shell及其區別

常見的各種shell及其區別 引子 for((i1;i<10;i)); do echo $(expr $i \* 3 1); done 網上搜到的 shell for循環腳本&#xff0c;別人都能正常運行&#xff0c;我卻報錯&#xff1a; Syntax error: Bad for loop variable究竟是怎么回事呢&#xff1f; shell簡介…

shell腳本 變量

shell腳本 變量類型 什么是Shell變量 用一個固定的字符串去表示不固定的內容。 Shell變量的類型 shell腳本中自定義變量的類型&#xff0c;我們這里分為&#xff1a; 自定義變量環境變量位置變量與定義變量 這四類&#xff0c;它們有一些相同點&#xff0c;但又有些不同點…

攻防世界web新手區解題 /cookie / disabled_button / weak_auth

cookie 題目描述&#xff1a;X老師告訴小寧他在cookie里放了些東西&#xff0c;小寧疑惑地想&#xff1a;‘這是夾心餅干的意思嗎&#xff1f;’ 使用burp suite抓包查看 發現提示&#xff1a; look-herecookie.php 于是在url后加上 cookie.php 得到提示查看返回 就得到了f…

Python 函數式編程

Python 函數式編程 轉自&#xff1a;https://www.liaoxuefeng.com/wiki/1016959663602400/1017328525009056&#xff0c;推薦去該鏈接讀原文&#xff0c;有習題和熱烈的評論區交流。 函數式編程 函數是Python內建支持的一種封裝&#xff0c;我們通過把大段代碼拆成函數&…

Python中的生成器與迭代器

Python中的生成器與迭代器 轉自&#xff1a;https://www.liaoxuefeng.com/wiki/1016959663602400/1017323698112640&#xff0c;推薦去該鏈接讀原文&#xff0c;有習題和熱烈的評論區交流。 生成器 通過列表生成式&#xff0c;我們可以直接創建一個列表。但是&#xff0c;受…

基于GET報錯的sql注入,sqli-lab 1~4

根據注入類型可將sql注入分為兩類&#xff1a;數字型和字符型 例如&#xff1a; 數字型&#xff1a; sleect * from table where if 用戶輸入id 字符型&#xff1a;select * from table where id 用戶輸入id &#xff08;有引號) 通過URL中修改對應的D值&#xff0c;為正常數字…

Python 裝飾器詳解(上)

Python 裝飾器詳解&#xff08;上&#xff09; 轉自&#xff1a;https://blog.csdn.net/qq_27825451/article/details/84396970&#xff0c;博主僅對其中 demo 實現中不適合python3 版本的語法進行修改&#xff0c;并微調了排版&#xff0c;本轉載博客全部例程博主均已親測可行…

xss原理和注入類型

XSS漏洞原理 : XSS又叫CSS(cross Site Script), 跨站腳本攻擊,指的是惡意攻擊者往Web頁面里插入惡意JS代碼,當用戶瀏覽該頁時,嵌入其中的Web里的JS代碼就會被執行,從而達到惡意的特殊目的. 比如:拿到cooike XSS漏洞分類: 反射性(非存儲型) payload沒有經過存儲,后端接收后,直接…

Python 裝飾器詳解(中)

Python 裝飾器詳解&#xff08;中&#xff09; 轉自&#xff1a;https://blog.csdn.net/qq_27825451/article/details/84581272&#xff0c;博主僅對其中 demo 實現中不適合python3 版本的語法進行修改&#xff0c;并微調了排版&#xff0c;本轉載博客全部例程博主均已親測可行…