如何将命令行参数作为字符串传递给从C执行的嵌入式Python脚本?
我有一个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将它们传递回Python解释器. 在metacode中,更好,更清晰的方法是这样的: string command_line_args = '-v -p "filename" -t="anotherfile" --list="["a","b"]" --myFunnyOpt' exec_file( filename,command_line_args,...) 我花了几个小时查看Boost和Python C-API文档,但我找不到任何有用的东西. 更新: 正如史蒂夫在下面的评论中所建议的,我在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('',' ','"'); 与在原始帖子中一样,您没有正确标记引用的字符串. 解决方法
由于您不会执行外部文件,因此可以使用帮助程序使shell命令为您执行解析.你的帮助程序可能是:
#include <stdio.h> int main (int argc,char *argv[]) { for (int i = 1; i < argc; ++i) printf("%sn",argv[i]); return 0; } 然后你可以拥有将你的单个参数字符串发送给帮助程序的代码(可能使用popen)并读回解析的参数,每个arg在一个单独的行上. unparsed_line.insert(0,"./parser_helper "); FILE *helper = popen(unparsed_line.c_str(),"r"); std::vector<std::string> args; std::vector<const char *> argv; std::string arg; while (fgetstring(arg,helper)) { args.push_back(arg); argv.push_back(args.rbegin()->c_str()); } pclose(helper); fgetstring例程是我写的,就像fgets和std :: getline之间的交叉.它一次从FILE *读取一行,填充std:string参数. static bool fgetstring (std::string &s,FILE *in) { bool ok = false; std::string r; char buf[512]; while (fgets(buf,sizeof(buf),in) != 0) { ++ok; r += buf; if (*r.rbegin() == 'n') { r.resize(r.size()-1); break; } } if (ok) s = r; return ok; } 我似乎记得SO上有一个与此类似的例程的帖子,但我找不到它.如果我稍后发现,我会更新我的帖子. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |