一、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