ユーザーの組み込み Python スクリプトを実行するための Python インターフェイスを公開する C++ プログラムがあります。
ユーザーは、実行する Python スクリプトのパスとコマンドライン引数を挿入します。次に、スクリプトが実行されます
boost::python::exec_file(filename, main_globals, main_globals)
コマンドライン引数を Python スクリプトに渡すには、Python C-API 関数を使用して設定する必要があります
PySys_SetArgv(int args, char** argv)
電話する前にexec_file()
。
ただし、これには、コマンドライン引数を含むユーザーの文字列をトークン化して引数のリストを取得し、それらを を介して Python インタープリターに戻す必要がありますPySys_SetArgv
。これは単なる時間の無駄ではありません。この方法では、カスタム ユーザーのスクリプトでのみ定義される背後のロジックを知らずに、メインの C++ プログラムがコマンド ライン文字列をトークン化する責任を負わなければならないからです。
はるかに優れたクリーンなアプローチは、メタコードで次のようになります。
string command_line_args = '-v -p "filename" -t="anotherfile" --list="["a", "b"]" --myFunnyOpt'
exec_file( filename, command_line_args, ...)
Boost と Python C-API のドキュメントを何時間も調べましたが、役に立つものは何も見つかりませんでした。これを実現する方法があるかどうか、つまり、コマンド ライン引数の文字列全体を C++ から埋め込み Python スクリプトに渡す方法があるかどうか知っていますか?
アップデート:
以下のコメントでスティーブが提案したように、 https://stackoverflow.com/a/8965249/320369に従って、入力文字列のトークン化の問題を解決しました。
私の場合、私は使用しました:
// defining the separators
std::string escape_char = "\\"; // the escape character
std::string sep_char = " "; // empty space as separator
std::string quote_char = ""; // empty string --> we don't want a quote char'
boost::escaped_list_separator<char> sep( escape_char, sep_char, quote_char );
次のように、文字列を含むタプルも解析できるようにしたかったからです。
'--option-two=("A", "B")'
そして、あなたが使用する場合:
escaped_list_separator<char> sep('\\', ' ', '"');
元の投稿と同様に、引用符で囲まれた文字列が正しくトークン化されていません。