ti-enxame.com

Python conclusão do argparse e do bash

Gostaria de obter o preenchimento automático nos meus scripts python também nos argumentos.

Eu realmente nunca tinha entendido como funcionava o bash_completion (para argumentos), mas depois que eu me aprofundei, entendi que:

  1. ele usa "complete" para vincular uma função de conclusão a um comando
  2. toda função de conclusão é basicamente uma cópia do analisador de argumentos

O segundo ponto em particular não é ótimo, porque eu gostaria que fosse gerado automaticamente.

A melhor coisa seria que o Shell solicitasse ao meu programa em todos os TAB o que concluir, mas tenho a impressão de que isso não pode realmente funcionar, está correto?

A segunda opção é provavelmente apenas escrever um conversor de um analisador argparse em uma função Shell que seja concluída corretamente.

54
andrea_crotti

Autopromoção desavergonhada: https://github.com/kislyuk/argcomplete

argcomplete fornece a conclusão do bash para o argparse.

62
weaver

Bash "conclusão" realmente é ótimo. E fácil para programas escritos em Python ....

Eu acho que é exatamente isso que você deseja: optcomplete: Auto-gerador de conclusão de shell para Python . Está disponível, por exemplo, como o pacote "python-optcomplete" no Ubuntu.

Você insere algumas linhas no seu programa python, e o usuário (uma vez) executa o programa bash "complete" para informar ao bash como concluir os argumentos:

complete -F _optcomplete <program>

e agora o usuário está completo! Por padrão, fornece uma conclusão simples das opções do programa. Veja o exemplo de como personalizar como a conclusão funciona para uma opção específica. É muito bem escrito e fácil de estender para lidar com subcomandos, opções alternativas de conclusão, etc.!

Atualização:

Para conclusão no zsh (para optparse e argparse), consulte genzshcomp 0.3.1: Python Package Index

Conforme observado por @englebip, ainda precisamos de algo semelhante para o novo módulo argparse, introduzido em Python 2.7 e 3.2, uma vez que optparse agora está obsoleto.

Aqui está a discussão sobre como avançar nessa direção:

Veja também este histórico de como é feito: Como o argparse (e o optparse descontinuado) responde ao pressionamento de tecla 'tab' após python nome do programa, no bash? - Stack Overflow

13
nealmcb