Что такое "argv" и что оно делает?

ARGV

Что на земле это?!

Изменить: Если вы можете, пожалуйста, напишите одну или две строки и объясните, как это работает?

7 ответов

Решение

Попробуйте эту простую программу, назовите ее program.py

import sys
print sys.argv

и попробуйте выполнить

python program.py
python program.py a b c
python program.py hello world

Обратите внимание, что сейчас argv.

Это означает вектор аргументов и содержит аргументы, переданные программе. Первым всегда является имя программы.

Например, если вы выполнили свою программу на Python так...

 $ python your_script.py --yes

... тогда ваш sys.argv будет содержать your_script.py а также --yes,

Прежде чем тратить время на "изучение некоторых более высоких уровней кода", вам необходимо научиться находить подобную информацию. Знание того, как искать незнакомую функцию / класс / переменную, без необходимости ждать 30-60 минут, пока люди на SO ответят вам (и, по-видимому, набирают много голосов в процессе), окажется гораздо более полезным, чем добавление еще одной часть информации для вашего репертуара.

Из встроенной справки:

>>> import sys
>>> help(sys)
…
argv -- command line arguments; argv[0] is the script pathname if known
…

Это работает с любым модулем. Часто отдельные классы и функции в модулях содержат более подробную информацию (но это не работает для argv, так как это просто listи списки не имеют пользовательской справки).

Если информации недостаточно, в документации (или в документации 2.x) говорится:

SYS.ARGV

Список аргументов командной строки, передаваемых скрипту Python. argv[0] - имя сценария (зависит от операционной системы, является ли это полным путем или нет). Если команда была выполнена с использованием параметра командной строки -c для интерпретатора, argv[0] устанавливается в строку '-c'. Если имя интерпретатора не было передано интерпретатору Python, argv[0] является пустой строкой.

Чтобы перейти к стандартному вводу или списку файлов, приведенному в командной строке, см. Модуль fileinput.

Первым результатом поиска в интернете "python argv" является сообщение в блоге автора Python Гвидо, которое может быть слишком сложным для вас, но второе - учебное пособие "Аргументы командной строки".

Как говорит большинство из этих вещей, многие простые сценарии часто могут просто использовать fileinput вместо того, чтобы иметь дело с argv напрямую, в то время как более сложные сценарии часто нужно использовать argparse (или же optparse, getoptили другие варианты, если вам нужно работать с Python 2.6 или более ранней версией).

Один пример, где sys.argv Правильна ли эта тривиальная программа для преобразования относительных имен путей в абсолютные (для тех, кто не работает на Linux или других платформах, в которых есть abspath, GNU readlink или аналогичный встроенный инструмент):

import os, sys
print('\n'.join(os.path.abspath(arg) for arg in sys.argv[1:]))

Или это инструмент "добавить", который просто добавляет кучу чисел (для тех, кто застрял в cmd.exe или других дефектных оболочках, в которых нет встроенной арифметики):

import sys
print(sum(int(arg) for arg in sys.argv[1:]))

Вы можете запустить программу на Python с аргументами или без них. Если вы используете аргументы, они находятся внутри вектора argv. Например

ПРОГРАММА ПИТОНА!!!

#!/usr/bin/python

import sys

print 'Number of arguments:', len(sys.argv), 'arguments.'
print 'Argument List:', str(sys.argv)

БЕГ СКРИПТА, КАК ЭТО

$ python test.py arg1 arg2 arg3

И РЕЗУЛЬТАТ ЕСТЬ

Number of arguments: 4 arguments.
Argument List: ['test.py', 'arg1', 'arg2', 'arg3']

примеры из учебника

Скрипт printArgv.py:

import sys
print sys.argv.__class__
spam = sys.argv[1:]
print spam

Запустите это с:python printArgv.py 1 2 3 4 5

Вы найдете выход:

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

Это означает, что sys.argv - это список параметров, которые вы вводите после имени скрипта.

Если у вас есть исполняемый скрипт на python, и вы вызываете его с такими аргументами:

myscript.py -a -b --input myfile --another_argument

затем sys.argv список, содержащий:

['myscript.py', '-a', '-b', '--input', 'myfile', '--another_argument']

Использование этого - единственный способ получить доступ к этим аргументам, и это его основное использование. Однако большинство приложений используют библиотеки, такие как модуль argparse, для доступа к этой информации без использования sys.argv непосредственно.

sys.argv отобразит аргументы командной строки, переданные при запуске скрипта, или вы можете сказать, что sys.argv будет хранить аргументы командной строки, переданные в python, при запуске из терминала

Он хранит аргументы в списке ds.

Пример использования: создайте файл, скажем: cmdlineargs.py, и вставьте в него следующее:

import sys
print sys.argv 

Теперь запустите файл в вашем терминале / cli:

python cmdlineargs.py 

или что-то вроде

python cmdlineargs.py example example1

Обратите внимание, что происходит сейчас. Ваш скрипт будет печатать все, что передано в вашем аргументе строки cmd, пока вы запускаете этот скрипт.

Важно знать:

print len(sys.argv) #total arguments passed
sys.argv[0] #this is your script name stored in sys.argv.
print sys.argv #display all arguments passed
sys.argv[0] #is the first argument passed, which is basically the filename.
sys.argv #stores all cmd line args in a list ds

Вы можете посмотреть каждый конкретный аргумент, передаваемый так:

cmdLineArg = len(sys.argv)
i=0
for argv in sys.argv:
    if cmdLineArg<=len(sys.argv) :
        print "argument",i,"is", str(sys.argv[i])
        i=i+1
    else:
        print "Only script name in sys.argv"

Пример результата:

Скажем, вы запускаете следующее в своем терминале.

python cmdlineargs.py example example1

Ваш результат должен выглядеть примерно так:

argument 0 is cmdlineargs.py
argument 1 is example
argument 2 is example1  

Обратите внимание, что аргумент 0 совпадает с именем файла. Надеюсь, это было полезно.


Спасибо за отклики, улучшая мой ответ за цикл. Еще немного Pythonian ответ должен выглядеть так:

i=0
for argv in sys.argv:
    if cmdLineArg==1:
        print "Only script name in sys.argv"
    elif (cmdLineArg>1 and cmdLineArg<=len(sys.argv)):
        print "argument ",i,"is", str(argv)
        i=i+1
print "total arguments passed:\t", totalargs

Я тоже новичок в python, поэтому у меня была привычка объявлять i и j для обхода массивов. :)

Другие вопросы по тегам