C语言调用Python

环境准备:

系统: Linux  - Ubuntu 22.04.

lsb_release -a -- 查看系统信息

 我的是这样:


No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.4 LTS
Release:        22.04
Codename:       jammy
 

Python3

先确定 自己是否有安装好 python3 的环境 ,有多种方式查看

我这里是通过 命令: python3 --version 查看的

没有安装的朋友先去安装好python3 ,站内很多教程这里就,不演示了

安装dev库

确认安装好 python3  后确认是否安装了  libpython3的 dev依赖库

                                 -- 这个库就是帮助我们C语言调用Python的

怎么确定是否安装:

执行以下命令查看:

      dpkg -l | grep libpython3

if 发现没有dev 的话,就根据自己的python版本号下载,我的是 3.10.12

下载dev:

执行以下命令:

sudo apt install libpython3.10-dev

更新源

下载是失败,请更新一下源

sudo apt-get update
这个命令,会访问源列表里的每个网址,并将软件列表保存在本地电脑

sudo apt-get upgrade
这个命令,会把本地已安装的软件,与软件列表里对应软件进行对比,如果发现已安装的软件版本太低,就会提示你更新(当然了,你可以不更新,那就没必要用这个命令了)。

3.源列表在哪?这个命令就可以修改了,通常你需要换源的时候需要。

sudo gedit /etc/apt/sources.list
/etc/apt/sources.list就是源列表所在地址了。

=====================

实例:

case1 : C语言下python的简单调用

#include "Python.h"
int main()
{
Py_Initialize(); // 初始化
PyRun_SimpleString("print ('funny')");
Py_Finalize(); //释放资源
}


编译: 

gcc simpledemo.c -o simpledemo -I /usr/include/python3.10 -l python3.10

运行    ./simpledemo 


 

============================================================



========================================

vi 小tips
:%s/PyErr_prin/PyErr_Print/g     --  替换

========================

case 2 :   调用 无参函数;

#if 0
1、包含Python.h头文件,以便使用Python API。
2、使用void Py_Initialize()初始化Python解释器,
3、使用PyObject *PyImport_ImportModule(const char *name)和PyObject
*PyObject_GetAttrString(PyObject *o, const char *attr_name)获取sys.path对象,

并利用int PyList_Append(PyObject *list, PyObject *item)将当前路径.添加到sys.path中,以便加载当前的Python模块(Python文件即python模块)。


4、使用PyObject *PyImport_ImportModule(const char *name)函数导入Python模块,并检查是否有错误。
5、使用PyObject *PyObject_GetAttrString(PyObject *o, const char *attr_name)函数获取
Python函数对象,并检查是否可调用。
6、使用PyObject *PyObject_CallObject(PyObject *callable, PyObject *args)函数调用
Python函数,并获取返回值。
7、使用void Py_DECREF(PyObject *o)函数释放所有引用的Python对象
8、结束时调用void Py_Finalize()函数关闭Python解释器
相关的函数参数说明参考网站(网站左上角输入函数名即可开始搜索):
https://docs.python.org/zh-cn/3/c-api/import.html
#endif


nopara.py文件

def say_funny():
   print('funny')

nopara.c文件

// PyUnicode_FromString   的租用

用于将一个以 null 结尾的 C 字符串转换为 Python 中的 Unicode 字符串对象

nopara.c文件


#include<Python.h>// 以便使用Python API

int main()
{
    Py_Initialize(); //初始化Python解释器
    PyObject *sys = PyImport_ImportModule("sys"); // 获取sys对象

    PyObject *path = PyObject_GetAttrString(sys,"path");// 获取sys.path对象

    PyList_Append(path, PyUnicode_FromString("."));//将当前路径.添加到sys.path中,以便加载当前的Python模块(Python文件即python模块)。


    PyObject *pModule= PyImport_ImportModule("nopara");// 导入Python模块,并检查是否有错误。
    if(!pModule)
    {
        PyErr_Print();
        printf("Error: failed to load nopara.py\n");
    }

    PyObject *pfunc =PyObject_GetAttrString(pModule,"say_funny"); //获取Python函数对象,并检查是否可调用。


    if(!pfunc)
    {
        PyErr_Print();
        printf("Error: failed to load say_funny\n");
    }

    PyObject *pValue = PyObject_CallObject(pfunc,NULL); //调用Python函数,并获取返回值。


    if(!pValue)
    {
        PyErr_Print();
        printf("Error:function call failed\n");
    }

   //释放所有引用的Python对象

    Py_DECREF(pValue);

    Py_DECREF(pfunc);

    Py_DECREF(pModule);

    Py_Finalize();  //关闭Python解释器
    return 0;
}


----------------------------------------


case2 : 调用有参函数:


#if 0
1、包含Python.h头文件,以便使用Python API。
2、使用void Py_Initialize()初始化Python解释器,
3、使用PyObject *PyImport_ImportModule(const char *name)和PyObject
*PyObject_GetAttrString(PyObject *o, const char *attr_name)获取sys.path对象,并利用
int PyList_Append(PyObject *list, PyObject *item)将当前路径.添加到sys.path中,以便加载
当前的Python模块(Python文件即python模块)。
4、使用PyObject *PyImport_ImportModule(const char *name)函数导入Python模块,并检查是否
有错误。
5、使用PyObject *PyObject_GetAttrString(PyObject *o, const char *attr_name)函数获取
Python函数对象,并检查是否可调用。
6、使用PyObject *Py_BuildValue(const char *format, ...)函数将C类型的数据结构转换成
Python对象,作为Python函数的参数,
没有参数不需要调用
7、使用PyObject *PyObject_CallObject(PyObject *callable, PyObject *args)函数调用
Python函数,并获取返回值。
8、使用int PyArg_Parse(PyObject *args, const char *format, ...)函数将返回值转换为C类
型,并检查是否有错误
,没有返回值时不需要调用。
9、使用void Py_DECREF(PyObject *o)函数释放所有引用的Python对象。

10、结束时调用void Py_Finalize()函数关闭Python解释器。
相关的函数参数说明参考网站(网站左上角输入函数名即可开始搜索):
https://docs.python.org/zh-cn/3/c-api/import.html
#endif


Py_BuildValue ("(s)",str)   // 第一个参数, () -- 表示元祖, s表示字符串 (s) --包含在元组内的字符串


多出 两步   -- 第六 第八:


================================


para.py


#nopara.py文件
#import sys


def say_funny(s):
   print(s)
   return s


#print(sys.path)


------------------------------------]


para.c

#include<Python.h>

int main()
{
    Py_Initialize();
    PyObject *sys = PyImport_ImportModule("sys");

    PyObject *path = PyObject_GetAttrString(sys,"path");

    PyList_Append(path, PyUnicode_FromString("."));


    PyObject *pModule= PyImport_ImportModule("para");
    if(!pModule)
    {
        PyErr_Print();
        printf("Error: failed to load para.py\n");
    }

    PyObject *pfunc =PyObject_GetAttrString(pModule,"say_funny");


    if(!pfunc)
    {
        PyErr_Print();
        printf("Error: failed to load say_funny\n");
    }
        
      char * category = "comedy";
       PyObject * pArgs=Py_BuildValue("(s)",category);//将C类型的数据结构转换成
Python对象,作为Python函数的参数


    PyObject *pValue = PyObject_CallObject(pfunc, pArgs);


    if(!pValue)
    {
        PyErr_Print();
        printf("Error:function call failed\n");
    }

    char * result = NULL;
     if(!PyArg_Parse(pValue,"s",&result))//将返回值转换为C类型,并检查是否有错误,
    {
                 
        PyErr_Print();
        printf("Error:para failed\n");
    
    }    
        printf("result=%s\n",result );
          

    Py_DECREF(pValue);

    Py_DECREF(pfunc);

    Py_DECREF(pModule);

    Py_Finalize();
    return 0;
}

  • 30
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种高级编程语言,而Python也是一种高级编程语言。在C语言调用Python程序可以通过使用Python的解释器来实现。要在C语言调用Python程序,首先需要在C中包含Python的头文件,以便可以使用Python的函数和数据结构。 在C代码中,可以使用Py_Initialize()函数来初始化Python解释器。然后可以使用PyRun_SimpleString()函数或PyRun_SimpleFile()函数来执行Python代码。这样可以将C语言中的数据传递给Python程序进行处理,并获取Python的返回结果。 此外,还可以使用PyImport_ImportModule()函数来导入Python模块,并使用PyObject_CallObject()函数来调用Python函数。通过这些函数的使用,可以在C语言中直接调用Python函数。 在调用Python程序之前,需要先确保Python解释器已经安装在计算机上,并且路径已正确配置好。可以通过设置环境变量或在代码中指定Python解释器的路径来实现。 需要注意的是,在调用Python程序时,C语言Python存储数据的方式是不同的。所以在C语言Python之间传递数据时,需要进行数据类型的转换。可以使用PyArg_ParseTuple()函数来将C语言的数据类型转换为Python的数据类型,或使用Py_BuildValue()函数将Python的数据类型转换为C语言的数据类型。 总之,通过上述方法,我们可以在C语言调用Python程序,实现C语言Python的互操作。这样可以充分利用C语言的性能和Python的灵活性,来开发更加复杂和强大的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值