Запрос на улучшение argparse
, упомянутый в комментарии @hpaulj, все еще остается открытым спустя более девяти лет, поэтому я решил, что другие люди могут извлечь выгоду из обходного пути, который я только что обнаружил. Основываясь на этом комментарии в запросе на улучшение, я обнаружил, что могу добавить параметр к двум различные взаимоисключающие группы, использующие этот синтаксис:
#!/usr/bin/env python
import argparse
import os
import sys
def parse_args():
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter
)
parser.add_argument("-d", "--device", help="Path to UART device", default="./ttyS0")
mutex_group1 = parser.add_mutually_exclusive_group()
mutex_group2 = parser.add_mutually_exclusive_group()
mutex_group1.add_argument(
"-o",
"--output-file",
help="Name of output CSV file",
default="sensor_data_sent.csv",
)
input_file_action = mutex_group1.add_argument(
"-i", "--input-file", type=argparse.FileType("r"), help="Name of input CSV file"
)
# See: https://bugs.python.org/issue10984#msg219660
mutex_group2._group_actions.append(input_file_action)
mutex_group2.add_argument(
"-t",
"--time",
type=int,
help="How long to run, in seconds (-1 = loop forever)",
default=-1,
)
# Add missing ']' to usage message
usage = parser.format_usage()
usage = usage.replace('usage: ', '')
usage = usage.replace(']\n', ']]\n')
parser.usage = usage
return parser.parse_args()
if __name__ == "__main__":
args = parse_args()
print("Args parsed successfully...")
sys.exit(0)
Это работает достаточно хорошо для моих целей:
$ ./fake_sensor.py -i input.csv -o output.csv
usage: fake_sensor.py [-h] [-d DEVICE] [-o OUTPUT_FILE | [-i INPUT_FILE | -t TIME]]
fake_sensor.py: error: argument -o/--output-file: not allowed with argument -i/--input-file
$ ./fake_sensor.py -i input.csv -t 30
usage: fake_sensor.py [-h] [-d DEVICE] [-o OUTPUT_FILE | [-i INPUT_FILE | -t TIME]]
fake_sensor.py: error: argument -t/--time: not allowed with argument -i/--input-file
$ ./fake_sensor.py -i input.csv
Args parsed successfully...
$ ./fake_sensor.py -o output.csv
Args parsed successfully...
$ ./fake_sensor.py -o output.csv -t 30
Args parsed successfully...
Доступ к закрытым членам argparse
, конечно, довольно ненадежен, поэтому я, вероятно, не стал бы использовать этот подход в рабочем коде. Кроме того, проницательный читатель может заметить, что сообщение об использовании вводит в заблуждение, поскольку оно подразумевает, что -o
и -i
можно использовать вместе, когда они не могут (!) Однако я использую этот скрипт только для тестирования, поэтому я не слишком обеспокоен . (Я думаю, что исправление сообщения об использовании «по-настоящему» потребует намного больше времени, чем я могу выделить для этой задачи, но, пожалуйста, прокомментируйте, если вы знаете хитрый хак для этого.)
person
evadeflow
schedule
31.03.2020