Списки и индексы Python sys.argv

В приведенном ниже коде я понимаю, что sys.argv использует списки, однако я не понимаю, как здесь используется индекс.

def main():

  if len(sys.argv) >= 2:
    name = sys.argv[1]
  else:
    name = 'World'
  print 'Hello', name

if __name__ == '__main__':
  main()

Если я изменю

name = sys.argv[1]

к

name = sys.argv[0] 

и введите что-то для возвращаемого аргумента:

Hello C:\Documents and Settings\fred\My Documents\Downloads\google-python-exercises
\google-python-exercises\hello.py

Какой смысл.

Может кто-нибудь объяснить, как здесь используется 2:

if len(sys.argv) >= 2:

И как здесь используется 1:

name = sys.argv[1] 

Ответ 1

скажем, в командной строке:

C:\> C:\Documents and Settings\fred\My Documents\Downloads\google-python-exercises
\google-python-exercises\hello.py John

чтобы упростить чтение, просто сократите его до:

C:\> hello.py John

argv представляет все элементы, которые поступают через ввод командной строки, но подсчет начинается с нуля (0) не одним (1): в этом случае "hello.py" - это элемент 0, "John" является элементом 1

Другими словами, sys.argv[0] == 'hello.py' и sys.argv[1] == 'John'... но посмотрите, сколько элементов это? 2, правильно! поэтому даже если числа равны 0 и 1, здесь есть два элемента.

len(sys.argv) >= 2 просто проверяет, введен ли вы как минимум два элемента. в этом случае мы ввели ровно 2.

теперь переведите свой код на английский:

define main() function:
    if there are at least 2 elements on the cmd-line:
        set 'name' to the second element located at index 1, e.g., John
    otherwise there is only 1 element... the program name, e.g., hello.py:
        set 'name' to "World" (since we did not get any useful user input)
    display 'Hello' followed by whatever i assigned to 'name'

так что это значит? это означает, что если вы введете:

  • "hello.py", код выводит "Hello World", потому что вы не указали имя
  • "hello.py John", код выводит "Hello John", потому что вы сделали
  • "hello.py John Paul", код все еще выводит "Hello John", потому что он не сохраняет и не использует sys.argv[2], который был "Paul" - вы можете видеть в этом случае, что len(sys.argv) == 3, потому что там 3 элемента в списке sys.argv?

Ответ 2

sys.argv - список аргументов, переданных программе Python. Первый аргумент, sys.argv[0], на самом деле является именем программы при ее вызове. Это не вещь Python, а то, как работают большинство операционных систем. Причина sys.argv[0] заключается в том, что вы можете изменить поведение своей программы в зависимости от того, как она была вызвана. sys.argv[1] - это, таким образом, первый аргумент, который вы фактически передаете программе.

Поскольку списки (как и большинство последовательностей) в Python начинают индексировать в 0, а потому, что индексирование за конец списка является ошибкой, вам нужно проверить, имеет ли список длину 2 или больше, прежде чем вы сможете получить доступ к sys.argv[1].

Ответ 3

Вкратце, sys.argv - это список слов, которые появляются в команде, используемой для запуска программы. Первое слово (первый элемент списка) - это имя программы, а остальные элементы списка - любые аргументы. На большинстве языков программирования (включая Python) списки индексируются с нуля, что означает, что первый элемент в списке (в данном случае - имя программы) равен sys.argv[0], а второй элемент (первый аргумент, если он есть) sys.argv[1] и т.д.

Тест len(sys.argv) >= 2 просто проверяет, что список имеет длину, большую или равную 2, что будет иметь место, если в программе был хотя бы один аргумент.

Ответ 4

Итак, если бы я хотел вернуть имя и фамилию, такие как: Hello Fred Gerbig, я бы использовал код ниже, этот код работает, но действительно ли это самый правильный способ сделать это?

import sys
def main():
  if len(sys.argv) >= 2:
    fname = sys.argv[1]
    lname = sys.argv[2]
  else:
    name = 'World'
  print 'Hello', fname, lname
if __name__ == '__main__':
  main()

Изменить: обнаружено, что приведенный выше код работает с двумя аргументами, но с ошибкой 1. Попробовал установить len на 3, но ничего не сделал, все равно сбой (перечитайте остальные ответы и теперь поймите, почему 3 ничего не сделали). Как обойти аргументы, если введен только один? Или как будет выглядеть проверка ошибок, которая вернулась "Вы должны ввести 2 аргумента"?

Изменить 2: выяснилось:

import sys
def main():
  if len(sys.argv) >= 2:
    name = sys.argv[1] + " " + sys.argv[2]
  else:
    name = 'World'
  print 'Hello', name
if __name__ == '__main__':
  main()

Ответ 5

Как уже объяснялось в разных атрибутах, sys.argv содержит аргументы командной строки, которые вызвали ваш Python script.

Однако Python поставляется с библиотеками, которые помогают легко анализировать аргументы командной строки. А именно, новый стандарт argparse. Использование argparse избавит вас от необходимости писать много шаблонов.