Python, fileinput и Click - PullRequest
       106

Python, fileinput и Click

0 голосов
/ 04 мая 2020

Я использую Click для разбора аргумента командной строки, и я хотел бы использовать библиотеку Python fileinput в одной подкоманде, но, похоже, Click оставляет sys.argv в этом виде is:

test.py:

import fileinput
import click

@click.group()
@click.option('-x', is_flag=True)
def cli(x):
    pass

@cli.command()
@click.option('-y', is_flag=True)
def read(y):
    for f in fileinput.input():
        for line in f:
            print(line)

if __name__ == '__main__':
    cli()

Test:

% python3 test.py -x read -y
Traceback (most recent call last):
  File "test.py", line 17, in <module>
    cli()
  File "/usr/lib/python3.8/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/usr/lib/python3.8/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/usr/lib/python3.8/site-packages/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/lib/python3.8/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "test.py", line 12, in read
    for f in fileinput.input():
  File "/usr/lib/python3.8/fileinput.py", line 248, in __next__
    line = self._readline()
  File "/usr/lib/python3.8/fileinput.py", line 366, in _readline
    self._file = open(self._filename, self._mode)
FileNotFoundError: [Errno 2] No such file or directory: '-x'

Теперь, конечно, мне нужно добавить декоратор Click, чтобы учесть произвольное количество завершающие аргументы, но даже простой случай, когда нет оставшихся аргументов и ввод файла занимает sys.stdin, не работает.

AFAIK Python argparse правильно увеличивает sys.argv так что это будет работать без проблем. Может ли Click это сделать? Как?


Обратите внимание, что я понимаю, что, вероятно, можно делать то, что делает fileinput с декораторами Click, и я могу и буду читать об этом в документации. То, что я не нашел в документации, и что я спрашиваю здесь, это как сделать аргументы Click pop из sys.argv, как это делает argparse.

...