如何在 C++ 中调用 python 解析器来执行 python 代码(二)?

本文测试在 C++ 中调用 Pandas 库来执行 Python 程序。

目录

安装 Pandas

为了加速安装,使用 -i 指定 阿里云的 python lib 源。为了省事,用了 sudo,你也可以使用 --user 安装在当前用户目录下。

$ sudo pip3 install pandas -i https://mirrors.aliyun.com/pypi/simple
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Collecting pandas
  Downloading https://mirrors.aliyun.com/pypi/packages/c3/e2/00cacecafbab071c787019f00ad84ca3185952f6bb9bca9550ed83870d4d/pandas-1.1.5-cp36-cp36m-manylinux1_x86_64.whl (9.5MB)
    61% |███████████████████▋            | 5.8MB 127kB/s eta 0:00:29

编写代码

下面的代价基于上一节的代码稍微修改而来,用到了 pandas 库。

[xiaochu.yh ~/tools/c-python] $cat main.cpp
#define PY_SSIZE_T_CLEAN
#include <Python.h>

int
main(int argc, char *argv[])
{
    wchar_t *program = Py_DecodeLocale(argv[0], NULL);
    if (program == NULL) {
        fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
        exit(1);
    }
    Py_SetProgramName(program);  /* optional but recommended */
    Py_Initialize();
    const char *script = ""
"import pandas as pd\n"
"mydataset = {\n"
"  'sites': [\"Google\", \"Runoob\", \"Wiki\"],\n"
"  'number': [1, 2, 3]\n"
"}\n"
"myvar = pd.DataFrame(mydataset)\n"
"print(myvar)\n";

    PyRun_SimpleString(script);
    if (Py_FinalizeEx() < 0) {
        exit(120);
    }
    PyMem_RawFree(program);
    return 0;
}

编译

$make
g++ -I/usr/include/python3.6m -I/usr/include/python3.6m  -Wno-unused-result -Wsign-compare -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv   -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv  -L/usr/lib64 -lpython3.6m -lpthread -ldl  -lutil -lm  -Xlinker -export-dynamic main.cpp

执行

$./a.out
    sites  number
0  Google       1
1  Runoob       2
2    Wiki       3

扩展

如果不希望使用全局的 pandas 库,而是使用指定路径的定制库,可以研究PYTHONPATH 这个参数:

PYTHONPATH=/my/packages/dir

总结

看上去,只要上下文环境正常,调用第三方库并不需要特殊逻辑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C调用Python传参可以通过使用Python的C语言扩展API来实现。首先需要引入Python.h头文件,并且在C代码使用Py_Initialize()函数来初始化Python解释器。然后可以使用PyRun_SimpleString()函数来执行Python代码,通过该函数可以将Python代码作为字符串传递给Python解释器执行。 在C代码调用Python传参的具体步骤如下: 1. 引入Python的C语言扩展API头文件,如Python.h。 2. 在C代码使用Py_Initialize()函数来初始化Python解释器。 3. 使用PyRun_SimpleString()函数来执行Python代码,将Python代码作为字符串传递给该函数。 4. 在Python代码定义需要传递的参数和相关操作。 5. 在C代码使用PyArg_ParseTuple()函数来解析Python传递的参数,并将其转换为C语言的变量。 6. 在C代码进行必要的操作,并将结果返回给Python解释器。 7. 使用Py_Finalize()函数来结束Python解释器的使用。 例如,我们可以在C代码调用一个Python函数,该函数接受两个参数并返回它们的和: ```c #include <Python.h> int main(int argc, char *argv[]) { Py_Initialize(); // 初始化Python解释器 // 执行Python代码 PyRun_SimpleString("import my_module\n" "result = my_module.add(3, 5)\n" "print(result)"); // 解析Python传递的参数 int sum; PyArg_ParseTuple(args, "i", &sum); // 在C进行必要的操作 int result = sum + 10; // 返回结果给Python解释器 PyObject *pyResult = Py_BuildValue("i", result); Py_Finalize(); // 结束Python解释器 return 0; } ``` 上述代码,我们通过PyRun_SimpleString函数执行了一段Python代码,该代码导入了一个名为my_module的模块,并调用了该模块的add函数来计算3和5的和。然后在C代码,我们使用PyArg_ParseTuple函数解析了Python传递的参数,并将结果存储到sum变量。接着对sum进行了一定的操作,最后将结果通过Py_BuildValue函数转换为PyObject对象,并返回给Python解释器。 需要注意的是,在使用C调用Python传参时,需要明确了解Python的C语言扩展API的使用方法,并根据具体需求进行相应的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值