Как передать полный список в качестве аргумента командной строки в 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]
Есть ли лучший способ сделать это?
Ответы
Ответ 1
Аргументы командной строки всегда передаются в виде строк. Вам нужно будет разобрать их в нужный тип данных самостоятельно.
>>> 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 и click, которые позволяют вам определять собственное преобразование типов аргументов, но argparse
обрабатывает "[2,3,4]"
же, как [
2
,
3
,
4
]
поэтому я сомневаюсь, что это будет полезно.
edit январь 2019 г. Похоже, что этот ответ еще немного поработал, поэтому я добавлю еще один вариант, взятый непосредственно из документации 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]
Ответ 2
Не изобретай велосипед. Используйте модуль 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]
Ответ 3
Я тестировал это на своем конце, и мой ввод выглядит следующим образом:
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])
Ответ 4
Почему бы и нет:
python foo.py 1,2,3,4 5,6,7,8
Гораздо чище, чем пытаться оценить python и не требует, чтобы ваш пользователь знал формат python.
import sys
list1 = sys.argv[1].split(',')
list2 = [int(c) for c in sys.argv[2].split(',')] # if you want ints
Ответ 5
Вы также можете сделать следующее:
скажем, у вас есть 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'>
Ответ 6
Вам нужно бежать:
python some.py \[2,3,4,5\] \[1,2,3,4\]
some.py
import sys
print sys.argv[1]
print sys.argv[2]
это дает мне:
[2,3,4,5]
[1,2,3,4]
![Bash out]()
UPDATE
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
Ответ 7
Нет, нет способа передать список в аргументе командной строки. Аргументы командной строки всегда являются строками. Но есть лучший способ конвертировать его в список. Вы можете сделать это так:
import ast
A = ast.literal_eval(strA)
B = ast.literal_eval(strB)