如何将命令行参数作为字符串传递给从C++执行的嵌入式 Python 脚本
how to pass command-line arguments as a string to an embedded Python script executed from C++?
我有一个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 解释器。这不仅仅是浪费时间,因为通过这种方式,主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('', ' ', '"');
与原始帖子一样,您没有正确标记带引号的字符串。
由于您不反对执行外部文件,因此您可以使用辅助程序使 shell 命令为您执行解析。您的帮助程序可以是:
#include <stdio.h>
int main (int argc, char *argv[])
{
for (int i = 1; i < argc; ++i) printf("%sn", argv[i]);
return 0;
}
然后,您可以使用代码将单个参数字符串发送到帮助程序(可能使用 popen
),并读回解析的参数,每个参数在单独的行上。
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上的一个帖子,它有一个类似的例程,但我找不到它。如果我以后找到它,我会更新我的帖子。
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- C++17中的并行执行策略
- QML按钮点击功能执行顺序
- 程序在执行程序的其余部分之前退出
- 为什么catch中的代码没有被执行
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 将执行、作业和WinAPI相乘
- 对字符数组中的元素执行逐位操作
- 为什么g++在未执行的代码处标记强制转换错误
- 如何使用原子指针执行双缓冲