簡體   English   中英

如何在 Python 中將整個列表作為命令行參數傳遞?

[英]How to pass an entire list as command line argument in Python?

我試圖將兩個包含整數的列表作為參數傳遞給 python 代碼。 但是sys.argv[i]將參數作為字符串列表獲取。

輸入看起來像,

$ python filename.py [2,3,4,5] [1,2,3,4]

我發現以下技巧可以轉換列表。

strA = sys.argv[1].replace('[', ' ').replace(']', ' ').replace(',', ' ').split()
strB = sys.argv[2].replace('[', ' ').replace(']', ' ').replace(',', ' ').split()
A = [float(i) for i in strA]
B = [float (i) for i in strB]

有一個更好的方法嗎?

不要重新發明輪子。 使用argparse 模塊,明確並傳入實際的參數列表

import argparse
# defined command line options
# this also generates --help and error handling
CLI=argparse.ArgumentParser()
CLI.add_argument(
  "--lista",  # name on the CLI - drop the `--` for positional/required parameters
  nargs="*",  # 0 or more values expected => creates a list
  type=int,
  default=[1, 2, 3],  # default if nothing is provided
)
CLI.add_argument(
  "--listb",
  nargs="*",
  type=float,  # any type/callable can be used here
  default=[],
)

# parse the command line
args = CLI.parse_args()
# access CLI options
print("lista: %r" % args.lista)
print("listb: %r" % args.listb)

然后你可以調用它使用

$ python my_app.py --listb 5 6 7 8 --lista  1 2 3 4
lista: [1, 2, 3, 4]
listb: [5.0, 6.0, 7.0, 8.0]

命令行參數始終作為字符串傳遞。 您需要自己將它們解析為所需的數據類型。

>>> input = "[2,3,4,5]"
>>> map(float, input.strip('[]').split(','))
[2.0, 3.0, 4.0, 5.0]
>>> A = map(float, input.strip('[]').split(','))
>>> print(A, type(A))
([2.0, 3.0, 4.0, 5.0], <type 'list'>)

有喜歡的庫argparse點擊,讓你定義自己的參數類型轉換,但argparse對待"[2,3,4]"一樣[ 2 , 3 , 4 ]所以我懷疑這將是有益的。

編輯 2019 年 1 月這個答案似乎仍然有一些作用,所以我將添加另一個直接從 argparse 文檔中獲取的選項。

您可以使用action=append來允許將重復的參數收集到一個列表中。

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])

在這種情況下,您會通過--foo ? 每個列表項一次。 使用 OP 示例: python filename.py --foo 2 --foo 3 --foo 4 --foo 5將導致foo=[2,3,4,5]

我對此進行了測試,我的輸入如下所示:

python foo.py "[1,2,3,4]" "[5,6,7,8,9]"

我正在執行以下操作來轉換感興趣的兩個參數:

import ast
import sys

list1 = ast.literal_eval(sys.argv[1])
list2 = ast.literal_eval(sys.argv[2])

為什么不:

python foo.py 1,2,3,4 5,6,7,8  

比嘗試 eval python 更干凈,並且不需要您的用戶知道 python 格式。

import sys

list1 = sys.argv[1].split(',')
list2 = [int(c) for c in sys.argv[2].split(',')]  # if you want ints

您還可以執行以下操作:

說,你有foo.py

import json
import sys
data = json.loads(sys.argv[1])
print data, type(data)

然后,如果您將上述內容運行為: python foo.py "[1,2,3]"

輸出:

[1, 2, 3] <type 'list'>

不,無法在命令行參數中傳遞列表。 命令行參數始終是字符串。 但是有一種更好的方法可以將其轉換為列表。 你可以這樣做:

import ast

A = ast.literal_eval(strA)
B = ast.literal_eval(strB)

你必須逃脫:

python some.py \[2,3,4,5\] \[1,2,3,4\]

一些.py

import sys

print sys.argv[1]
print sys.argv[2]

這給了我:

[2,3,4,5]
[1,2,3,4]

猛擊

更新

import sys
import ast

d = ast.literal_eval(sys.argv[1])
b = ast.literal_eval(sys.argv[2])

for a in d:
    print a

for e in b:
    print e

首先會給:

2
3
4
5

第二個會給

1
2
3
4

您可以簡單地使用 argparse 的nargs='+'選項

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--myarg', dest='myarg', required=False, help='--myarg 100 100 100 takes a list of 3 elements, each is of value 100 ', nargs='+', type=int, default=[100,100,100])

然后你可以像這樣傳遞參數:

python your_file.py --myarg 1 2 3

這將作為 [1,2,3] 存儲在 myarg 中的程序中

print(myarg)

輸出:

[1,2,3]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM