A biblioteca padrão do Python tem módulos para análise de arquivo de configuração ( configparser ), leitura de variável de ambiente ( os.environ ) e análise de argumento de linha de comando ( argparse ). Quero escrever um programa que faça tudo isso e também:
Tem uma cascata de valores de opção :
- valores de opção padrão, substituídos por
- opções do arquivo de configuração, substituídas por
- variáveis de ambiente, substituídas por
- opções de linha de comando.
Permite uma ou mais localizações de arquivo de configuração especificadas na linha de comando com por exemplo
--config-file foo.conf
, e lê isso (em vez de, ou adicional ao arquivo de configuração usual). Isso ainda deve obedecer à cascata acima.Permite definições de opções em um único lugar para determinar o comportamento de análise para arquivos de configuração e a linha de comandos.
Unifica as opções analisadas em uma única coleção de valores de opção para o resto do programa acessar sem se importar de onde vieram.
Tudo que eu preciso está aparentemente na biblioteca padrão do Python, mas eles não funcionam juntos perfeitamente.
Como posso conseguir isso com desvio mínimo da biblioteca padrão do Python?
jterrace
dado uma recompensa aqui para me levar ao limite o suficiente para tentar fazer algo assim :)Respostas:
O módulo argparse torna isso maluco, contanto que você esteja satisfeito com um arquivo de configuração que se pareça com uma linha de comando. (Eu acho que isso é uma vantagem, porque os usuários só terão que aprender uma sintaxe.) Definir fromfile_prefix_chars como, por exemplo
@
, faz com que,é equivalente a
se
@baz.conf
é,Você pode até mesmo fazer com que seu código procure
foo.conf
automaticamente, modificandoargv
O formato desses arquivos de configuração é modificável criando uma subclasse de ArgumentParser e adicionando um método convert_arg_line_to_args .
fonte
ATUALIZAÇÃO: finalmente consegui colocar isso no pypi. Instale a versão mais recente via:
Ajuda e instruções completas estão aqui .
Postagem original
Aqui está uma coisinha que eu criei juntos. Sinta-se à vontade para sugerir melhorias / relatórios de bugs nos comentários:
FAÇAM
Esta implementação ainda está incompleta. Aqui está uma lista parcial de TODO:
argparse
lida com as mensagens de erroConformidade com o comportamento documentado
dest
deargs
dentroadd_argument
, em vez de depender doAction
objetoparse_args
função que useparse_known_args
. (por exemplo, cópiaparse_args
dacpython
implementação para garantir que ela chamaparse_known_args
.)Coisas menos fáceis ...
Eu não tentei nada disso ainda. É improvável - mas ainda possível! - que funcione ...
section
no arquivo de configuração).section
no arquivo de configuração).fonte
pip install configargparser
Existe uma biblioteca que faz exatamente isso chamada configglue .
Ele também oferece suporte a variáveis de ambiente.
Há também outra biblioteca chamada ConfigArgParse que é
Você pode se interessar pela palestra do PyCon sobre configuração de Łukasz Langa - Deixe-os configurar!
fonte
Embora eu não tenha experimentado sozinho, existe a biblioteca ConfigArgParse , que afirma que faz a maioria das coisas que você deseja:
fonte
Parece que a biblioteca padrão não resolver isso, deixando cada programador para remendar
configparser
eargparse
eos.environ
todos juntos em formas desajeitadas.fonte
A biblioteca padrão do Python não fornece isso, até onde eu sei. Resolvi isso sozinho escrevendo código para usar
optparse
eConfigParser
analisar a linha de comando e os arquivos de configuração, e fornecer uma camada de abstração sobre eles. No entanto, você precisaria disso como uma dependência separada, o que em seu comentário anterior parece intragável.Se você quiser ver o código que escrevi, está em http://liw.fi/cliapp/ . Ele está integrado à minha biblioteca de "estrutura de aplicativo de linha de comando", uma vez que é uma grande parte do que a estrutura precisa fazer.
fonte
Tentei algo parecido recentemente, usando "optparse".
Eu o configurei como uma subclasse de OptonParser, com um comando '--Store' e um '--Check'.
O código a seguir deve ajudar você. Você só precisa definir seus próprios métodos de 'carregar' e 'armazenar' que aceitam / retornam dicionários e você está pronto.
fonte
Para atender a todos esses requisitos, eu recomendaria escrever sua própria biblioteca que usa parse [opt | arg] e configparser para a funcionalidade subjacente.
Dados os dois primeiros e o último requisito, eu diria que você deseja:
Passo um: Faça uma passagem do analisador de linha de comando que apenas procure a opção --config-file.
Etapa dois: analisar o arquivo de configuração.
Etapa três: configurar uma segunda passagem do analisador de linha de comando usando a saída da passagem do arquivo de configuração como padrão.
O terceiro requisito provavelmente significa que você deve projetar seu próprio sistema de definição de opções para expor todas as funcionalidades do optparse e configparser de seu interesse, e escrever algumas dicas para fazer as conversões entre eles.
fonte
Aqui está um módulo que hackeado que lê argumentos de linha de comando, configurações de ambiente, arquivos ini e valores de chaveiro também. Também está disponível em uma essência .
fonte
Você pode usar o ChainMap para isso. Dê uma olhada no meu exemplo que forneci em "Qual é a melhor maneira de permitir que as opções de configuração sejam substituídas na linha de comando em Python?" ASSIM pergunta.
fonte
A biblioteca confect eu construí é justamente para atender à maioria das suas necessidades.
Ele pode anexar opções de linha de comando a alguns comandos de clique
(desculpe, não é argparse, mas o clique é melhor e muito mais avançado.
confect
pode suportar argparse na versão futura).confect
carrega arquivos de configuração Python, não JSON / YMAL / TOML / INI. Assim como o arquivo de perfil IPython ou o arquivo de configurações DJANGO, o arquivo de configuração Python é flexível e fácil de manter.Para obter mais informações, verifique o README.rst no repositório do projeto . Esteja ciente de que ele suporta apenas Python3.6 ou superior.
Exemplos
Anexando opções de linha de comando
Ele cria automaticamente uma mensagem de ajuda abrangente com todas as propriedades e valores padrão declarados.
Carregando variáveis de ambiente
Só precisa de uma linha para carregar as variáveis de ambiente
fonte