указание списка в качестве аргумента командной строки в python - PullRequest
21 голосов
/ 18 января 2010

Я использую getopt для обработки необязательного аргумента командной строки, который должен принимать список.Примерно так:

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

Но это обрезает все после "[1,"

Мои вопросы: А) Есть ли способ указать список без преобразования его в строку?(используя getopt)

B) Если я хочу преобразовать список в строку, как преобразовать этот список в строку?например, что-то вроде mylist.split ("?"), чтобы избавиться от квадратных скобок ??Есть ли лучший способ?

Спасибо

Ответы [ 6 ]

26 голосов
/ 18 января 2010

Есть два варианта, о которых я могу подумать:

  • Используйте optparse и используйте действие append, чтобы указать, что вы хотите сделатьas: foo.py --my_list=1 --my_list=2 ....
  • Укажите вашу командную строку как foo.py --my_list='1,2,3,4,5', а затем используйте x.split(','), чтобы получить значения в списке.Вы можете использовать getopt или optparse для этого метода.

Преимущество первого метода заключается в том, что вы можете получать целые значения в списке напрямую, за счет увеличения длины командной строки (но вы можете добавить опцию с одним символом для --my_list, если хотите.Преимущество второго заключается в более короткой командной строке, но после split() вам необходимо преобразовать строковые значения '1', '2' и т. Д. В целые числа (также довольно просто).

10 голосов
/ 16 января 2014

Если я не могу использовать стандартный синтаксический анализатор (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 и вставляя список в виде строки кода, мы получаем желаемый результат.

Полезные ссылки:

Использование функции python eval () и ast.literal_eval ()?

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

7 голосов
/ 18 января 2010

Может быть, вам стоит заключить аргумент в кавычки?

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

В противном случае каждое пространство будет рассматриваться как разделитель аргументов.

4 голосов
/ 07 декабря 2017

Обновленный способ - использовать библиотеку 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
1 голос
/ 16 ноября 2011

На странице помощи 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"

"

0 голосов
/ 08 апреля 2018

Я был перенаправлен с двойного вопроса:
Как передать массив в python через командную строку - Переполнение стека

Я отвечаю на этот вопрос:
Аргументы в командной строке являются строками, они не анализируются как литералы в программе.
argv автоматически строит строки в список из аргументов командной строки (разделенных пробелами), короче говоря, sys.argv это список.

    from sys import argv
    cmd = "arr = {sys.argv[1]}".format(argv)
    exec(cmd)
    print(arr[2])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...