C语言执行python语句,C语言调用python无参函数和有参函数

一、Python的安装和环境搭建

1.环境的搭建:在香橙派3.0.6版本的镜像里已经默认自带了python3.10的版本,只需要安装python3 dev 的依赖包就好了。

1、查看当前Linux下自带的Python版本
python --version
    
2、更新Linux源
sudo apt update
    
3、安装Python所需要的环境-代码如下(通用代码:树莓派、全志、Linux均适用)
sudo apt install -y build-essential zlib1g-dev \
libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev \
libreadline-dev libffi-dev curl libbz2-dev
    
4、载python3.9源码压缩包
wget \
https://www.python.org/ftp/python/3.9.10/Python-3.9.10.tgz
 
5、解压包
tar xvf Python-3.9.10.tgz
    
6、进入python文件操作-配置
./configure --enable-optimizations
    
7、查看创建好的Makefile文件
vi Makefile
    
8、编译(大概35分钟)
make -j4
    
9、安装
sudo make install
    
10、查看python安装路径
/usr/local/bin
 
11、可以查看到其他路径下的python版本
which python
 
12、可以将python2.7版本删除
sudo rm -f /usr/bin/python
 
13.建立一个软链接专门指向python3.9
sudo ln -s /usr/local/bin/python3.9 /usr/bin/python
 
14.更新源
sudo apt install -y python-pip python3-pip
 
15.更新源(返回主目录下再操作)
mkdir .pip 建立pip工作文件夹
 
cd .pip
 
vi pip.conf 添加 pip 服务器配置文件
 
内容如下:
[global]
timeout = 6000
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn

安装好之后输入python进入命令行模式

2.python3.10 dev依赖包的安装

dpkg -l | grep libpython3

检验是否已经安装了python3.10 的依赖包,如果安装了如图所示

二、C语言执行python语句

2.1直接调用python语句

// simpledemo.c
#include "Python.h"
int main()
{
	Py_Initialize(); // 初始化
	//int PyRun_SimpleString(const char *command)
    PyRun_SimpleString("print ('funny')");
    Py_Finalize(); //释放资源; 最后在程序结束时使用Py_Finalize()函数关闭Python解释器,并释放资源
}

2.2编译运行语句

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

执行结果 funny

三、C语言执行python无参函数

3.1上文调用了print('funny')这条语句,现在把这条语句放在napara.py的文件的函数里,如下

#nopara.py文件
def say_funny():
	print('funny')

3.2用C语言进行调用

//nopara.c
#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

#include <Python.h>
int main()
{
    Py_Initialize();//创建新的python环境,加载所有内置模块和扩展模块,-->c中执行py
    // 将当前路径添加到sys.path中
    PyObject *sys = PyImport_ImportModule("sys");
    PyObject *path = PyObject_GetAttrString(sys, "path");//获取引用
    PyList_Append(path, PyUnicode_FromString("."));
    //将当前路径.添加到sys.path中,以便加载当前的Python模块(Python文件即python模块)。

    // 导入nopara模块
    PyObject *pModule = PyImport_ImportModule("nopara");
    if (!pModule)
    {
        PyErr_Print();
        printf("ERROR: failed to load nopara.py\n");
        return 1;
    }
    // 获取say_funny函数对象
    PyObject *pFunc = PyObject_GetAttrString(pModule, "say_funny");
    if (!pFunc || !PyCallable_Check(pFunc))
    {
        PyErr_Print();
        printf("ERROR: function say_funny not found or not callable\n");
        return 1;
    }
    // 调用say_funny函数并获取返回值
    PyObject *pValue = PyObject_CallObject(pFunc, NULL);
    if (!pValue)
    {
        PyErr_Print();
        printf("ERROR: function call failed\n");
        return 1;
    }
    // 释放所有引用的Python对象
    Py_DECREF(pValue);
    Py_DECREF(pFunc);
    Py_DECREF(pModule);
    // 关闭Python解释器
    Py_Finalize();
    return 0;
}

编译运行程序

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

成功输出

funny

四、C语言调用有参函数

4.1 C语言调用有参函数,首先定义一个带参数和返回值的函数

​
#nopara.py文件
import sys //import sys: 这行代码导入了Python的 sys 模块,该模块提供了一系列与Python解释器和它的环境操作相关的变量和函数。导入这个模块允许脚本访问 sys 中定义的属性,如 sys.path

def say_funny(s): //def say_funny(s):: 这是一个函数定义,定义了一个名为 say_funny 的函数,它接受一个参数 s
    print('funny') //在函数内部,首先打印出字符串 ‘funny’
    return s //然后函数返回传入的参数 s
# print(sys.path) //# print(sys.path): 这一行是被注释掉的代码,以 # 开头表示这是一个注释,不会被Python解释器执行。如果取消注释,该行代码会打印出当前Python解释器的模块搜索路径列表 sys.path。这个列表包含了Python在运行时查找模块的目录路径

​

4.2 用C语言进行调用

//nopara.c
#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

#include <Python.h>//包含Python.h头文件,以便使用Python API。
int main()
{
    Py_Initialize();//使用void Py_Initialize()初始化Python解释器,
    // 将当前路径添加到sys.path中
    PyObject *sys = PyImport_ImportModule("sys");//初始化python解释器
    PyObject *path = PyObject_GetAttrString(sys, "path");
    PyList_Append(path, PyUnicode_FromString("."));
    // 导入para模块
    PyObject *pModule = PyImport_ImportModule("para");
    if (!pModule)
    {
        PyErr_Print();
        printf("Error: failed to load nopara.py\n");
    }
    //获取say_funny函数对象
    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);
    //调用say_funny函数并获取返回值
    PyObject *pValue = PyObject_CallObject(pFunc, pArgs);
    if (!pValue)
    {
        PyErr_Print();
        printf("Error: function call failed\n");
    } 
    //将返回值转换为C类型
    char *result = NULL;
    
    if (!PyArg_Parse(pValue, "s", &result))
    {
        PyErr_Print();
        printf("Error: parse failed\n");
    }
    //打印返回值
    printf("pValue=%s\n", result);
    //释放所有引用的Python对象
    Py_DECREF(pValue);
    Py_DECREF(pFunc);
    Py_DECREF(pModule);
    //释放所有引用的Python对象
    Py_Finalize();
    return 0;
}

编译运行程序

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

​

正常输出

funny
pValue=comedy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值