Передать массив в качестве аргумента командной строки скрипту

avatar
AbstProcDo
8 апреля 2018 в 00:02
2963
2
4

Я хочу поэкспериментировать с кодами из командной строки, поэтому импортируйте argv из sys.

    from sys import argv
    def binary_search(array, item):
        low = 0
        high = len(array) - 1
        while low <= high:
            mid = (low + high) // 2 # round down if not an even 
            guess = array[mid]
            if guess == item:
                return mid
            if guess > item:
                high = mid - 1
            else:
                low = mid + 1
        return None

    def main():
        script, array, item = argv
        binary_search(array, item)

При запуске из командной строки:

    $ python3 binary_search.py [1, 2, 3] 8
    Traceback (most recent call last):  File "binary_search.py", line 94, in <module>
        main()  File "binary_search.py", line 89, in main
        script, array, item = argvValueError: too many values to unpack (expected 3)

Я проверил и обнаружил, что аргументы, переданные из командной строки, обрабатываются argv как str.

Как передать массив в качестве аргумента?

Источник
Pedro Lobito
8 апреля 2018 в 00:36
2

Возможный дубликат Как передать массив в python через командную строку

Ответы (2)

avatar
Taylor Iserman
8 апреля 2018 в 00:15
2

Есть несколько способов сделать это...

использование re

Использование регулярных выражений может быть одним из самых простых способов справиться с этим.

from sys import argv
import re

def binary_search(array, item):
    low = 0
    high = len(array) - 1
    while low <= high:
        mid = (low + high) // 2 # round down if not an even 
        guess = array[mid]
        if guess == item:
            return mid
        if guess > item:
            high = mid - 1
        else:
            low = mid + 1
    return None

def main():
    array = re.findall(r"[\w]+", argv[1])
    array = [int(i) for i in array]
    item = int(argv[2])

    binary_search(array,item)


if __name__== "__main__":
    main()

использование exec()

Вы также можете использовать exec(), что может быть более рискованным и сложным. Вот простой пример:

from sys import argv

command = 'mylist = {0}'.format(argv[1])

exec(command)

for item in mylist:
    print(item)

пример вывода:

C:\path>py foo.py [1,2,3]
1
2
3
avatar
AbstProcDo
8 апреля 2018 в 02:47
1

Аргументы в командной строке являются строками, они не анализируются в программе, как литералы.

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

Кроме того, модуль argparse помогает

Модуль argparse упрощает создание удобных интерфейсов командной строки. Программа определяет, какие аргументы ей требуются, и argparse выяснит, как их проанализировать из sys.argv. Модуль argparse также автоматически создает сообщения справки и сообщения об использовании и выдает ошибки, когда пользователи передают программе недопустимые аргументы.