Python sys.argv списки и индексы - PullRequest
24 голосов
/ 13 апреля 2010

В приведенном ниже коде я понимаю, что 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] 

Ответы [ 5 ]

37 голосов
/ 13 апреля 2010

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

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, здесь есть 2 элемента.

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?
10 голосов
/ 13 апреля 2010

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

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

5 голосов
/ 13 апреля 2010

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

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

4 голосов
/ 13 апреля 2010

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

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()

Редактировать: Обнаружено, что приведенный выше код работает с 2 аргументами, но вылетает с 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()
2 голосов
/ 16 июля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...