Вопрос-Ответ

What does "sys.argv[1]" mean? (What is sys.argv, and where does it come from?)

Что означает "sys.argv [1]"? (Что такое sys.argv и откуда оно взялось?)

В настоящее время я сам изучаю Python, и мне просто интересно (со ссылкой на мой пример ниже) в упрощенных терминах, что sys.argv[1] представляет. Это просто запрос ввода?


#!/usr/bin/python3.1

# import modules used here -- sys is a very standard one
import sys

# Gather our code in a main() function
def main():
print ('Hello there', sys.argv[1])
# Command line args are in sys.argv[1], sys.argv[2] ..
# sys.argv[0] is the script name itself and can be ignored

# Standard boilerplate to call the main() function to begin
# the program.
if __name__ == '__main__':
main()

Возможно, вас направили сюда, потому что вы спрашивали о IndexError в вашем коде, который использует sys.argv. Проблема не в вашем коде; проблема в том, что вам нужно запустить программу таким образом, чтобы она sys.argv содержала правильные значения. Пожалуйста, прочтите ответы, чтобы понять, как sys.argv работает.

Если вы прочитали и поняли ответы, и у вас все еще возникают проблемы в Windows, проверьте, не принимает ли скрипт Python sys.argv в Windows, устраняет ли проблему. Если вы пытаетесь запустить программу изнутри IDE, вам может понадобиться справка по IDE - пожалуйста, найдите, но сначала проверьте, можете ли вы успешно запустить программу из командной строки.

Переведено автоматически
Ответ 1

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

Для каждого вызова Python, sys.argv автоматически создается список строк, представляющих аргументы (разделенные пробелами) в командной строке. Название происходит от соглашения о программировании на C , в котором argv и argc представляют аргументы командной строки.

Вы захотите узнать больше о списках и строках по мере ознакомления с Python, но пока вот несколько вещей, которые следует знать.

Вы можете просто создать скрипт, который выводит аргументы в том виде, в каком они представлены. Он также выводит количество аргументов, используя len функцию в списке.

from __future__ import print_function
import sys
print(sys.argv, len(sys.argv))

Для скрипта требуется Python 2.6 или более поздней версии. Если вы вызываете этот скрипт print_args.py, вы можете вызвать его с другими аргументами, чтобы посмотреть, что произойдет.

> python print_args.py
['print_args.py'] 1

> python print_args.py foo and bar
['print_args.py', 'foo', 'and', 'bar'] 4

> python print_args.py "foo and bar"
['print_args.py', 'foo and bar'] 2

> python print_args.py "foo and bar" and baz
['print_args.py', 'foo and bar', 'and', 'baz'] 4

Как вы можете видеть, аргументы командной строки включают имя скрипта, но не имя интерпретатора. В этом смысле Python рассматривает скрипт как исполняемый файл. Если вам нужно знать имя исполняемого файла (в данном случае python), вы можете использовать sys.executable.

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

Теперь в вашем коде на Python вы можете использовать этот список строк в качестве входных данных для вашей программы. Поскольку списки индексируются целыми числами, основанными на нуле, вы можете получить отдельные элементы, используя синтаксис list[0]. Например, чтобы получить имя скрипта:

script_name = sys.argv[0] # this will always work.

Хотя это и интересно, вам редко нужно знать имя своего скрипта. Чтобы получить первый аргумент после скрипта для имени файла, вы могли бы сделать следующее:

filename = sys.argv[1]

Это очень распространенное использование, но обратите внимание, что оно завершится ошибкой IndexError, если аргумент не был указан.

Кроме того, Python позволяет ссылаться на фрагмент списка, поэтому, чтобы получить другой список только из предоставленных пользователем аргументов (но без имени скрипта), вы можете сделать

user_args = sys.argv[1:] # get everything after the script name

Кроме того, Python позволяет присваивать последовательность элементов (включая списки) именам переменных. Итак, если вы ожидаете, что пользователь всегда будет указывать два аргумента, вы можете присвоить эти аргументы (в виде строк) двум переменным:

user_args = sys.argv[1:]
fun, games = user_args # len(user_args) had better be 2

Итак, чтобы ответить на ваш конкретный вопрос, sys.argv[1] представляет первый аргумент командной строки (в виде string), предоставленный рассматриваемому скрипту. Он не будет запрашивать ввод, но завершится ошибкой IndexError, если в командной строке после имени скрипта не будут указаны аргументы.

Ответ 2

sys.argv[1] содержит первый аргумент командной строки, передаваемый вашему скрипту.

Например, если ваш скрипт назван hello.py и вы выдаете:

$ python3.1 hello.py foo

или:

$ chmod +x hello.py  # make script executable
$ ./hello.py foo

Ваш скрипт выведет:

Привет, foo
Ответ 3

sys.argv это список.

Этот список создается вашей командной строкой, это список ваших аргументов командной строки.

Например:

в вашей командной строке вы вводите что-то вроде этого,

python3.2 file.py something

sys.argv станет списком ['file.py', 'something']

В данном случае sys.argv[1] = 'something'

Ответ 4

Просто добавляю к ответу Фредерика, например, если вы вызываете свой скрипт следующим образом:

./myscript.py foo bar

sys.argv[0] было бы "./myscript.py" sys.argv[1] было бы "foo", а sys.argv[2] было бы "bar" ... и так далее.

В вашем примере кода, если вы вызовете скрипт следующим образом ./myscript.py foo , результатом скрипта будет "Hello there foo".

2023-09-09 18:30 python