Как предоставить python argparse.parser с аргументами внутри кода без аргументов командной строки?

У меня есть код, который принимает аргументы командной строки в 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?

Вы также можете создать args = argparse.Namespace(config_file='some_file.yaml', ...) (пропустив шаг parse_args).

hpaulj 30.05.2019 08:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
3 813
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Примечание. Как уже упоминал @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.

ShadowRanger 30.05.2019 01:14

Это была опечатка. Спасибо. И да, вы правы в том, что sys.argv не нужен. Я обновлю его.

Azim 30.05.2019 01:15

Файл модульного теста для argparse проверяет как прямой список строк, так и измененный sys.argv.

hpaulj 30.05.2019 01:53

@hpaulj: Яр. Это совершенно законно, причина не делать этого в том, что вы не должны использовать глобальное состояние для решения локальной проблемы. Содержимое sys.argv часто что-то значит, и вы не должны возиться с ними волей-неволей, если есть Любые другой способ достичь ваших целей.

ShadowRanger 30.05.2019 02:07

В этом случае с ноутбуком Jupyter настоящий sys,argv уже использовался сервером Jupyter. Таким образом, изменение его для «локального» использования должно быть приемлемым, хотя это может повлиять на другие ноутбуки на том же сервере.

hpaulj 30.05.2019 02:27
Ответ принят как подходящий

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.

Другие вопросы по теме