主な質問は次のとおりです。設定ファイルをチューリング完全言語(Pythonなど)にしたいですか?それが必要な場合は、GuileやLuaなどの他の(チューリング完了)スクリプト言語を埋め込むことも検討してください(Pythonよりも「使用」または「埋め込み」が簡単であると認識される可能性があるため、Extending&の章を読んでください)Pythonの埋め込み)。(-Eg他の回答ので、私はそれをさらに議論しないでしょうアモンによっては -深さという議論)が、ことがわかり、アプリケーション内のスクリプト言語を埋め込むことで、主要な建築の選択はあなたが非常に考慮しなければならないことを、早期に; 後でその選択をすることは本当にお勧めしません!
「スクリプト」を介して構成可能なプログラムのよく知られた例は、GNU emacsエディター(またはおそらく独自の領域ではAutoCAD)です。したがって、スクリプトを受け入れると、一部のユーザーは最終的にその機能を広範囲に使用し、おそらく乱用することになり、数千行のスクリプトを作成することに注意してください。したがって、十分に優れたスクリプト言語を選択することが重要です。
ただし、(少なくともPOSIXシステムでは)初期化時に構成「ファイル」を動的に計算できるようにすると便利かもしれません(もちろん、システム管理者またはユーザーに健全な構成の負担を任せます。実際は構成です)ファイルまたはコマンドからのテキスト)。そのためには、単純に採用可能性条約を(および文書化、それを)設定ファイルのパスは、例えば、Aで始まること!
や|
、実際にシェルでコマンドを使用すると、と読んでいましたパイプライン。これにより、ユーザーは、最も使い慣れている「プリプロセッサ」または「スクリプト言語」を使用する選択ができます。
(動的に計算された構成を受け入れる場合、セキュリティの問題についてユーザーを信頼する必要があります)
したがって、初期化コードでは、main
(たとえば)いくつかの--config
引数 confarg
を受け入れてFILE*configf;
、そこから引数を取得します。その引数が!
((confarg[0]=='!')
...の場合)で始まる場合、configf = popen(confarg+1, "r");
そのパイプを使用して閉じpclose(configf);
ます。それ以外の場合はconfigf=fopen(confarg, "r");
、そのファイルを使用して閉じますfclose(configf);
(エラーチェックを忘れないでください)。pipe(7)、popen(3)、fopen(3)を参照してください。Pythonでコーディングされたアプリケーションについては、os.popenなどについて読んでください。
(上記のトリックをバイパスする!foo.config
ために渡すという名前の構成ファイルを渡したい奇妙なユーザー向けのドキュメント)./!foo.config
popen
ところで、このようなトリックは利便性にすぎません(上級ユーザーが構成ファイルを生成するためにシェルスクリプトをコーディングするなどを必要としないようにするため)。ユーザーがバグを報告する場合は、生成された構成ファイルを送信する必要があります...
また、たとえばdlopen(3)を使用して、初期化時にプラグインを使用およびロードする機能を使用してアプリケーションを設計できることにも注意してください(そのプラグインについてユーザーを信頼する必要があります)。繰り返しになりますが、これは非常に重要なアーキテクチャ上の決定です(これらのプラグインとアプリケーションに関するある程度安定したAPIと規則を定義して提供する必要があります)。
Pythonのようなスクリプト言語でコーディングされたアプリケーションの場合、evalまたはexecまたは同様のプリミティブのプログラム引数を受け入れることもできます。繰り返しますが、セキュリティの問題は(上級)ユーザーの関心事です。
構成ファイルのテキスト形式(生成されたかどうかに関係なく)については、ほとんどの場合それを適切に文書化する必要があると思います(そして、特定の形式の選択はそれほど重要ではありませんが、ユーザーがその中のいくつかの-スキップされたコメント)。JSON(できれば、//
eolまたは/*
... */
... までの通常のコメントを受け入れてスキップするJSONパーサーで)、YAML、XML、INI、または独自のものを使用できます。構成ファイルの解析はかなり簡単です(そのタスクに関連する多くのライブラリがあります)。