У меня есть код, который принимает аргументы командной строки в parser
и изменяет некоторые параметры конфигурации. Что-то вроде этого:
команда:
python mycode.py --config-file "some_file.yaml" SOMETHING.subsetting_a 2 SOMETHING.subsetting_b 3
а затем он делает:
import argparse
parser = argparse.ArgumentParser(description = "Some description here")
parser.add_argument(
"--config-file",
default = "",
metavar = "FILE",
help = "path to config file",
type=str,
)
//some more 'add_argument' lines here
args = parser.parse_args()
Но поскольку я использую блокнот jupyter, было бы проще предоставить аргументы непосредственно синтаксическому анализатору, как если бы они поступали из командной строки. Как я могу создать строку, содержащую команду (как указано выше), и передать ее parser
?
Примечание. Как уже упоминал @ShadowRanger, нет необходимости использовать sys.argv
. Смотрите его ответ.
Один из способов — использовать sys.argv
для имитации аргументов командной строки:
import sys
sys.argv = [
"--config-file" , "some_file.yaml",
"SOMETHING.subsetting_a" , "2",
"SOMETHING.subsetting_b" , "3"]
args = parser.parse_args(sys.argv)
Содержимое args похоже на это:
> Namespace(config_file='some_file.yaml', opts=['SOMETHING.subsetting_a', '2', 'SOMETHING.subsetting_b', '3')
что похоже на вывод print(parser.parse_args())
.
Вы передали несуществующее arguments
в parse_args
. Я думаю, вы могли неправильно понять документацию; вы могли бы передать list
напрямую в качестве аргумента parse_args
вместо того, чтобы вообще изменять sys.argv
.
Это была опечатка. Спасибо. И да, вы правы в том, что sys.argv не нужен. Я обновлю его.
Файл модульного теста для argparse
проверяет как прямой список строк, так и измененный sys.argv
.
@hpaulj: Яр. Это совершенно законно, причина не делать этого в том, что вы не должны использовать глобальное состояние для решения локальной проблемы. Содержимое sys.argv
часто что-то значит, и вы не должны возиться с ними волей-неволей, если есть Любые другой способ достичь ваших целей.
В этом случае с ноутбуком Jupyter настоящий sys,argv уже использовался сервером Jupyter. Таким образом, изменение его для «локального» использования должно быть приемлемым, хотя это может повлиять на другие ноутбуки на том же сервере.
parse_args
первый необязательный аргумент — это список аргументов для разбора, подпись:
ArgumentParser.parse_args(args=None, namespace=None)
Он просто берет args
из sys.argv
, если вы его не предоставляете.
Так что просто назовите это как:
args = parser.parse_args(['mycode.py', '--config-file', "some_file.yaml", 'SOMETHING.subsetting_a', '2', 'SOMETHING.subsetting_a'])
(с list
, содержащим все, что вам нравится), и он будет использовать его вместо sys.argv
.
Вы также можете создать
args = argparse.Namespace(config_file='some_file.yaml', ...)
(пропустив шагparse_args
).