2010-01-18 115 views
17

我正在使用getopt來處理命令行可選參數,它應該接受一個列表。事情是這樣的:指定一個列表作爲python中的命令行參數

foo.py --my_list=[1, 2, 3, 4,5] 

但這修剪後 「[1,」 一切

我的問題是: A)有沒有它轉換成字符串來指定列表的方式嗎? (使用getopt)

B)如果我要將列表轉換爲字符串,如何將此列表轉換爲字符串?例如像mylist.split(「?」)來擺脫方括號?有沒有更好的辦法?

謝謝

回答

23

有跡象表明,我能想到的兩個選項:

  • 使用optparse,並使用append行動來指定你想要做什麼爲:foo.py --my_list=1 --my_list=2 ...
  • 指定您的命令行爲foo.py --my_list='1,2,3,4,5',然後使用x.split(',')來獲取您的值在列表中。此方法可以使用getoptoptparse

第一種方法的好處是,你可以在列表中獲得整數值,直接在命令行是更長的費用(但如果你願意,你可以添加--my_list單性格特徵選項)。第二個的優點是命令行較短,但在split()之後,需要將字符串值'1','2'等轉換爲整數(非常簡單)。

+2

因爲這篇文章是5歲,'optparse'現在已被棄用''argparse' – SAAD 2015-09-04 13:06:43

+0

你是什麼意思'使用append行動'?這聽起來令人興奮,但不確定你在說什麼。 – 2017-06-03 02:06:48

+0

@MonicaHeddneck請參閱https://docs.python.org/3/library/optparse.html#standard-option-actions - 他們有一個「append」動作的例子:'parser.add_option(「 - t」,「 --tracks「,action =」append「,type =」int「)'。 – 2017-06-03 04:28:55

7

也許你應該只是將引數括在引號中?

foo.py "--my_list=[1, 2, 3, 4,5]" 

否則,每個空間將被視爲參數的分隔符。

+2

而這還不是蟒蛇,因爲但由於其解析這些參數,並將其提供給Python程序外殼。 – extraneon 2010-01-18 14:29:02

+1

部分屬實。在Windows上,命令行只是一個字符串。即使UNIX沒有任何將參數傳遞給程序的特殊數據結構,它仍然只是一個字符串。但是,這是一個廣泛實施的慣例,但並不普遍。是的,C運行時具有這方面的規格。 – Joey 2010-01-18 14:33:10

+1

您也可以執行'--my-list =「[1,2,3,4,5]」'。我通常使用這種形式,因爲它通常就像'--my-list =「$ MY_LIST」'。 – 2010-01-18 14:43:14

1

從Python optparse的幫助頁面: 「

parser.add_option("-f") 
parser.add_option("-p", type="float", nargs=3, dest="point") 

在解析命令行

-f foo.txt -p 1 -3.5 4 -fbar.txt 

optparse將設置

options.f = "foo.txt" 
options.point = (1.0, -3.5, 4.0) 
options.f = "bar.txt" 

10

如果我不能用一個標準的解析器(optparse或argparse),以我的應用程序,然後我用ast.literal_eval函數解析式列表的輸入參數如下:

import sys, ast 

inputList = ast.literal_eval(sys.argv[1]) 
print type(inputList) 
print inputList 

讓假設這個代碼存儲在testParser.py文件中。通過執行該腳本:

$ python testParser.py "[1,2,3,4, [123, 456, 789], 'asdasd']" 

我們得到以下的輸出:

<type 'list'> 
[1, 2, 3, 4, [123, 456, 789], 'asdasd'] 

因此,使用足夠安全ast.literal_eval功能和插入表作爲一串代碼,我們有理想的結果。

相關鏈接:

Using python's eval() vs. ast.literal_eval()?

http://docs.python.org/2/library/functions.html?highlight=eval#eval

1

更新的方法是使用argparse庫並添加列表作爲命令行參數。這樣,您不必進行任何手動解析。

例子:

parser = argparse.ArgumentParser() 
parser.add_argument(
     "-values", 
     nargs="*", # expects ≥ 0 arguments 
     type=int, 
     default=[35, 40, 50, 60, 70, 80, 90], # default list if no arg value 
    ) 

,你會再打電話這樣的:

python3 someprogram.py -values 1 2 3 
相關問題