La pregunta principal es: ¿desea que su archivo de configuración esté en algún lenguaje completo de Turing (como Python)? Si lo desea, también puede considerar incrustar algún otro lenguaje de script (Turing completo) como Guile o Lua (porque podría percibirse como "más simple" usar o incrustar que Python; lea el capítulo sobre Extensión y Incrustación de Python ). No lo discutiré más a fondo (porque otras respuestas, por ejemplo, Amon , lo discutieron en profundidad), pero tenga en cuenta que incrustar un lenguaje de secuencias de comandos en su aplicación es una elección arquitectónica importante , que debe considerar muy pronto; ¡Realmente no recomiendo hacer esa elección más tarde!
Un ejemplo bien conocido de un programa configurable a través de "scripts" es el editor GNU emacs (o probablemente AutoCAD en el dominio propietario); así que tenga en cuenta que si acepta las secuencias de comandos, algún usuario eventualmente usaría, y quizás abusaría, en su punto de vista, esa facilidad ampliamente y crearía una secuencia de comandos de miles de líneas; por lo tanto, la elección de un lenguaje de script suficientemente bueno es importante.
Sin embargo (al menos en los sistemas POSIX), usted podría considerar conveniente para que el "archivo" de configuración para ser dinámicamente calculada en tiempo de inicialización (por supuesto, dejando la carga de una configuración de cuerdo a su administrador del sistema o usuario, en realidad se trata de una configuración texto que proviene de algún archivo o de algún comando). Para eso, simplemente podría adoptar la convención (y documentarla ) de que una ruta de archivo de configuración que comienza con, por ejemplo, !
ao a |
es en realidad un comando de shell que leería como una tubería . Esto deja a su usuario la opción de usar cualquier "preprocesador" o "lenguaje de script" con el que esté más familiarizado.
(debe confiar en su usuario sobre los problemas de seguridad si acepta una configuración calculada dinámicamente)
Entonces, en su código de inicialización, su main
(por ejemplo) aceptaría algún --config
argumento confarg
y obtendría algo FILE*configf;
de él. Si ese argumento comienza con !
(es decir, si (confarg[0]=='!')
...), usaría configf = popen(confarg+1, "r");
y cerraría esa tubería con pclose(configf);
. De lo contrario, usaría configf=fopen(confarg, "r");
y cerraría ese archivo con fclose(configf);
(no olvide la comprobación de errores). Ver tubo (7) , popen (3) , fopen (3) . Para una aplicación codificada en Python, lea sobre os.popen , etc.
(documento también para el usuario extraño que desea pasar un archivo de configuración llamado !foo.config
a pasar ./!foo.config
para evitar el popen
truco anterior)
Por cierto, tal truco es solo una conveniencia (para evitar que el usuario avanzado, por ejemplo, codifique algún script de shell para generar un archivo de configuración ). Si el usuario desea informar cualquier error, debe enviarle el archivo de configuración generado ...
Tenga en cuenta que también puede diseñar su aplicación con la capacidad de usar y cargar complementos en el momento de la inicialización, por ejemplo, con dlopen (3) (y debe confiar en su usuario acerca de ese complemento). Nuevamente, esta es una decisión arquitectónica muy importante (y debe definir y proporcionar una API y una convención bastante estables sobre estos complementos y su aplicación).
Para una aplicación codificada en un lenguaje de script como Python, también podría aceptar algún argumento de programa para eval o exec o primitivas similares. Una vez más, los problemas de seguridad son la preocupación del usuario (avanzado) .
Con respecto al formato de texto para su archivo de configuración (ya sea generado o no), creo que en su mayoría necesita documentarlo bien (y la elección de algún formato en particular no es tan importante; sin embargo, le recomiendo permitir que su usuario pueda poner algunos comentarios omitidos en su interior). Puede usar JSON (preferiblemente con algún analizador JSON que acepte y omita comentarios con //
eol habitual o /*
... */
...), YAML, XML o INI o lo suyo. Analizar un archivo de configuración es razonablemente fácil (y encontrará muchas bibliotecas relacionadas con esa tarea).