本文测试在 C++ 中调用 Pandas 库来执行 Python 程序。
目录
- 如何在 C++ 中调用 python 解析器来执行 python 代码(一)?
- 如何在 C++ 中调用 python 解析器来执行 python 代码(二)?
- 如何在 C++ 中调用 python 解析器来执行 python 代码(三)?
- 如何在 C++ 中调用 python 解析器来执行 python 代码(四)?
- 如何在 C++ 中调用 python 解析器来执行 python 代码(五)?
- 如何在 C++ 中调用 python 解析器来执行 python 代码(六)?
- 如何在 C++ 中调用 python 解析器来执行 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
总结
看上去,只要上下文环境正常,调用第三方库并不需要特殊逻辑。