sys.argv содержит '-c', но не скрипт.Зачем? - PullRequest
0 голосов
/ 10 октября 2018

Мне просто любопытно, какое поведение sys.argv мне кажется странным и непоследовательным.

Я ожидал, что sys.argv будет содержать только аргументы скрипта (а не аргументы, которые анализируются исполняемым файлом python3).).

На практике я вижу, что sys.argv содержит аргумент -c, предназначенный для python3.Что меня удивляет, так это то, что следующий аргумент - тело сценария - отсутствует.Я ожидаю либо 2 аргумента, либо 4, но не 3.

Какая логика стоит за этим?

$ python3 -c 'import sys;print(sys.argv)' 1 2
['-c', '1', '2']

Обновление : ОК.Я понял.Это происходит только с аргументом -c, а не с другими аргументами:

$ python3 -b -c 'import sys;print(sys.argv)' -d 1 2
['-c', '-d', '1', '2']

Я все еще нахожу это сбивающим с толку, и в случае встроенного сценария argv[0] будет содержать текст сценария или -c <script text> илиpython3 -c <script text>

PS Вот сценарий, который сначала смутил меня:

python3 -c '
import argparse
import sys
parser = argparse.ArgumentParser()
print(parser.parse_known_args(sys.argv))
' -a 1 -b 2 -c 3
(Namespace(), ['-c', '-a', '1', '-b', '2', '-c', '3'])

Я был удивлен, увидев первый -c в выводе.Оказывается, вы не должны просто передавать argv в parse_known_args.

1 Ответ

0 голосов
/ 10 октября 2018

Должно быть что-то (поэтому программы, ожидающие, что предоставленные пользователем аргументы начинаются с argv[1], по-прежнему работают правильно), и -c такой же разумный выбор, как и любой.


Логика в том, что есть только один специальный элемент argv, и это первый - argv[0] - используемый для определения того, как был вызван скрипт.Иногда это имя, под которым оно вызывалось;в этом случае -c сообщает, что он был вызван передачей python -c '...script text...'.

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


Для сравнения, посмотрите на bash -c '...script text...' "$0" "$1", что может привести к некоторой путанице (принято ставить _ в позицию $0, но тогда люди, которые видят это, всегда спрашивают "для чего этот заполнитель? "; это добавляет очень мало значения).Подход Python всегда использовать -c в позиции заполнителя и передавать дальнейшие аргументы в позиции 1 и далее имеет смысл.

...