Сводка
Мне нужен сценарий, который сохранял бы все входные аргументы в текстовый файл в таком формате, чтобы я мог повторно запустить сценарий, используя fromfile_prefix_chars с этим файлом. Это сделано для того, чтобы обеспечить легкую воспроизводимость и сохранить аргументы, которые использовались для генерации определенных данных.
У меня очень хрупкая и неполная реализация. Я уверен, что есть способ получше, но я не нашел его в Google.
** Вопрос: как захватить а) все аргументы с помощью б) чистого и лаконичного кода?**
Пример рабочего процесса
Запуск сценария python script.py --count 7 --channel-stdev 17 /somepath
Это должен создать текстовый файл с именем args_out.txt с содержимым
from pathlib import Path
import logging
import argparse
from argparse import Namespace, ArgumentParser
from typing import Optional, List, Tuple
def get_arg_parser() -> ArgumentParser:
parser = ArgumentParser(description='Test',
fromfile_prefix_chars='@')
parser.add_argument('--count', default=1, type=int,
help='Number of ')
parser.add_argument('--channel-mean', default=4.5, type=float,
help='Mean number ')
parser.add_argument('--channel-stdev', default=3, type=float,
help='Standard deviation ')
# Logging control
log_group = parser.add_mutually_exclusive_group()
log_group.add_argument('-v', '--debug', action='store_true', help='Enable debug mode')
log_group.add_argument('-q', '--quiet', action='store_true', help='Enable quiet mode')
# I/O control
parser.add_argument('input', nargs='+', help='Path to a single')
return parser
def parse_args(arg_list: Optional[List[str]] = None) -> Namespace:
parser = get_arg_parser()
return parser.parse_args(arg_list)
def convert_args_to_text(args: Namespace, parser: ArgumentParser) -> str:
""" Convert an argparse.Namespace object to a list of strings that can be written to a file and then
read as arguments again. """
required, optionals, optionals_store_true = get_arg_name_to_argument_dicts(parser)
text = ''
for k, v in vars(args).items():
k_dash = k.replace('_', '-')
if k_dash in optionals:
text = add_key_and_value(text, key=k_dash, value=v)
elif k_dash in optionals_store_true:
if v:
text = add_key_and_value(text, key=v, value=None)
elif k_dash in required:
text = add_key_and_value(text, key=None, value=v)
else:
logging.warning(f"skipping argument {k}")
return text
def get_arg_name_to_argument_dicts(parser: ArgumentParser) -> Tuple[dict, dict, dict]:
""" Here I try to extract the argument names and whether they are optional or required from the ArgParser
This is very brittle FIXME """
optionals = {}
optionals_store_true = {} # These are only added if they are true
required = {}
for optk, optv in parser._optionals._option_string_actions.items():
if not optk.startswith('--'):
# Skip short options
continue
if isinstance(optv, argparse._StoreAction):
optionals[optk.strip('--')] = optv
elif isinstance(optv, argparse._StoreTrueAction):
optionals_store_true[optk.strip('--')] = optv
for req_group_actions in parser._positionals._group_actions:
name = req_group_actions.dest
required[name] = req_group_actions
return required, optionals, optionals_store_true
def add_key_and_value(text: str, key: Optional[str], value: Optional[Tuple[str, List]]) -> str:
""" Add a argument key and value to a text block. """
if key is not None:
text += f"--{key}\n"
if value is None:
return text
if isinstance(value, list):
for vi in value:
text += f'{vi}\n'
else:
text += f'{value}\n'
return text
def main():
args = parse_args()
print(args)
text = convert_args_to_text(args, get_arg_parser())
with open('args_out.txt', 'w') as f:
f.write(text)
if __name__ == '__main__':
main()
Сводка Мне нужен сценарий, который сохранял бы все входные аргументы в текстовый файл в таком формате, чтобы я мог повторно запустить сценарий, используя fromfile_prefix_chars с этим файлом. Это сделано для того, чтобы обеспечить легкую воспроизводимость и сохранить аргументы, которые использовались для генерации определенных данных. У меня очень хрупкая и неполная реализация. Я уверен, что есть способ получше, но я не нашел его в Google. ** Вопрос: как захватить а) все аргументы с помощью б) чистого и лаконичного кода?** Пример рабочего процесса [list] [*]Запуск сценария python script.py --count 7 --channel-stdev 17 /somepath Это должен создать текстовый файл с именем args_out.txt с содержимым [/list] [code]--count 1 --channel-mean 4.5 --channel-stdev 3 /somepath [/code] [list] [*]Я могу перезапустить скрипт, используя python script.py @args_out.txt [/list] Минимальный пример [code]from pathlib import Path import logging import argparse from argparse import Namespace, ArgumentParser from typing import Optional, List, Tuple
def convert_args_to_text(args: Namespace, parser: ArgumentParser) -> str: """ Convert an argparse.Namespace object to a list of strings that can be written to a file and then read as arguments again. """ required, optionals, optionals_store_true = get_arg_name_to_argument_dicts(parser)
text = '' for k, v in vars(args).items(): k_dash = k.replace('_', '-') if k_dash in optionals: text = add_key_and_value(text, key=k_dash, value=v)
elif k_dash in optionals_store_true: if v: text = add_key_and_value(text, key=v, value=None)
elif k_dash in required: text = add_key_and_value(text, key=None, value=v) else: logging.warning(f"skipping argument {k}")
return text
def get_arg_name_to_argument_dicts(parser: ArgumentParser) -> Tuple[dict, dict, dict]: """ Here I try to extract the argument names and whether they are optional or required from the ArgParser This is very brittle FIXME """ optionals = {} optionals_store_true = {} # These are only added if they are true required = {} for optk, optv in parser._optionals._option_string_actions.items(): if not optk.startswith('--'): # Skip short options continue
Моя цель - сохранить огромную 2D -матрицу как двоичную в KDB Q, чтобы мой код Python мог импортировать ее как матрицу Numpy. Я играл с numpy.fromfile и numpy.memmap, но я не думаю, что KDB пишет его в бинарный формат, который Numpy может понять. Я...
Моя цель - сохранить огромную 2D -матрицу как двоичную в KDB Q, чтобы мой код Python мог импортировать ее как матрицу Numpy. Я играл с numpy.fromfile и numpy.memmap, но я не думаю, что KDB пишет его в бинарный формат, который Numpy может понять. Я...
В django я хочу получить файл из формы, затем передать его функции, а затем выполнить с ним распознавание текста. но я получаю ошибку io.UnsupportedOperation: fileno.
вот часть view.py:
@login_required(login_url='/profile/login/')
def...