C语言实现调用python绘图

⌚Time: 2022-11-04 18:02:19

👨‍💻Author: Jack Ge

首先安装python

https://www.python.org/downloads/windows/

安装时要勾选tcl/tk,否则之后将在绘图阶段会出错


Matplotlib is currently usingagg, which is a non-GUI backend

g++要和python都是32或者64位,达到链接库的兼容,否则在链接阶段会报错

g++查看位数的办法:


g++ -v

i686说明是23位

python查看位数的方法:


python

用到python的matplotlib库,使用pip工具进行安装,其中-i http://pypi.douban.com/simple --trusted-host pypi.douban.com选项是更换安装源,默认源下载太慢


pip install matplotlib -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

编辑代码


#include<Python.h>//python的c语言头文件

int main(int argc, const char* argv[]){

    Py_Initialize();//使用python之前,要调用Py_Initialize()这个函数进行初始化

    PyRun_SimpleString("import os,sys"); //PyRun_SimpleString执行python代码

    PyRun_SimpleString("import matplotlib.pyplot as plt"); 

    PyRun_SimpleString("sys.argv.append('D:/chezhe.py')");//设置python的argv[0]参数

    PyRun_SimpleString("plt.plot([1,2,3,4], [1.1,2.1,3.4,4])"); 

    PyRun_SimpleString("plt.plot([1,2,3,4], [3.3,2.3,1.3,1])"); 

    PyRun_SimpleString("plt.show()"); 

    Py_Finalize();//调用Py_Finalize

    return 0;

}

由于是c语言调用python,对于python的argv[0]代表python当前文件名称是空的,会导致以下报错


baseName = os.path.basename(sys.argv[0])

IndexError: list index out of range

因此要设置一个python文件名。


PyRun_SimpleString("sys.argv.append('D:/chezhe.py')");

使用matplotlib库的plot函数进行绘图


import matplotlib.pyplot as plt

plt.plot([1,2,3,4], [1.1,2.1,3.4,4])

编译运行,使用-ID:\python\include -LD:\python\libs -lpython37指定python的c语言头文件和链接库文件目录,并且链接到python37.lib库文件,python的头文件和链接库目录分别位于安装目录下的include和libs文件夹下


g++ demo.c -std=c++11 -ID:\python\include -LD:\python\libs -lpython37

a.exe

结果