Мне просто любопытно, какое поведение 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
.