我有一个 C++ 程序,它公开了一个 Python 接口来执行用户的嵌入式 Python 脚本。
用户插入要运行的 Python 脚本的路径和命令行参数。然后脚本通过
boost::python::exec_file(filename, main_globals, main_globals)
要将命令行参数传递给 Python 脚本,我们必须通过 Python C-API 函数来设置它们
PySys_SetArgv(int args, char** argv)
打电话之前exec_file()
。
但这需要对包含命令行参数的用户字符串进行标记以获取参数列表,然后通过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('\\', ' ', '"');
与原始帖子一样,您没有正确标记引用的字符串。