当前位置:首页 » 编程语言 » c嵌python

c嵌python

发布时间: 2022-12-20 05:25:32

‘壹’ 怎么样才能在c程序中嵌入python而不用依赖系统安装的python而运行。也说是说怎么把pyth

这个思路不是很行得通。。建议题主再思考一下程序结构。

  1. 为何要在C程序中嵌入python呢?

  2. windows下,如果是一个独立的python脚本,可以用py2exe转换成一个可独立运行的exe。因此如果能把python代码分离出来,问题就简单了。

‘贰’ 请教高手,我在C/C++中嵌入python,用PyImport

你需要确认你c编译器是否和你import的mole使用的是同一版本的编译器。如果不同的话,这种问题是可能出现的,因为不同版本编译器使用的C runtime是不一样的,这些runtime之间可能会出现冲突

‘叁’ python怎样嵌入c

c语言编写一个动态库,提供两个函数,两个数的整形求和,两个浮点数的求和。取名为mylib.c。

将c函数文件编译成so动态库。运行gcc mylib.c -fPIC -shared -o libtest.so命令,在目录下可以看到生成的库文件libtest.so。

Python调用so库文件。首先导入ctypes,其次用CDLL加载so文件,最后调用对应的函数。将python代码保存到pydemo.py中。

执行python pydemo.py查看运行结果。

众多python培训视频,尽在python学习网,欢迎在线学习!

‘肆’ 求助 关于c程序中嵌入Python的问题

#include int main() { Py_Initialize(); /* Python解释器初始化 */ PyRun_SimpleString("print 'hi,python!'"); /* 运行字符串 */ Py_Finalize(); /* 结束Python解释器,释放资源 */ return 0; }

‘伍’ 请教高手,我在C/C++中嵌入python,用PyImport


#include<iostream>
#include<Python.h>

usingnamespacestd;

voidHelloWorld();
voidAdd();
voidTestTransferDict();
voidTestClass();

intmain()
{
cout<<"StartingTest..."<<endl;

cout<<"HelloWorld()-------------"<<endl;
HelloWorld();
cout<<"Add()--------------------"<<endl;
Add();
cout<<"TestDict-----------------"<<endl;
TestTransferDict();
cout<<"TestClass----------------"<<endl;
TestClass();

system("pause");
return0;
}

//调用输出"HelloWorld"函数
voidHelloWorld()
{
Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化
PyObject*pMole=NULL;//声明变量
PyObject*pFunc=NULL;//声明变量
pMole=PyImport_ImportMole("Test001");//这里是要调用的Python文件名
pFunc=PyObject_GetAttrString(pMole,"HelloWorld");//这里是要调用的函数名
PyEval_CallObject(pFunc,NULL);//调用函数,NULL表示参数为空
Py_Finalize();//调用Py_Finalize,这个和Py_Initialize相对应的.
}

//调用Add函数,传两个int型参数
voidAdd()
{
Py_Initialize();

PyObject*pMole=NULL;
PyObject*pFunc=NULL;
pMole=PyImport_ImportMole("Test001");//Test001:Python文件名
pFunc=PyObject_GetAttrString(pMole,"add");//Add:Python文件中的函数名
//创建参数:
PyObject*pArgs=PyTuple_New(2);//函数调用的参数传递均是以元组的形式打包的,2表示参数个数
PyTuple_SetItem(pArgs,0,Py_BuildValue("i",5));//0---序号i表示创建int型变量
PyTuple_SetItem(pArgs,1,Py_BuildValue("i",7));//1---序号
//返回值
PyObject*pReturn=NULL;
pReturn=PyEval_CallObject(pFunc,pArgs);//调用函数
//将返回值转换为int类型
intresult;
PyArg_Parse(pReturn,"i",&result);//i表示转换成int型变量
cout<<"5+7="<<result<<endl;

Py_Finalize();
}

//参数传递的类型为字典
voidTestTransferDict()
{
Py_Initialize();

PyObject*pMole=NULL;
PyObject*pFunc=NULL;
pMole=PyImport_ImportMole("Test001");//Test001:Python文件名
pFunc=PyObject_GetAttrString(pMole,"TestDict");//Add:Python文件中的函数名
//创建参数:
PyObject*pArgs=PyTuple_New(1);
PyObject*pDict=PyDict_New();//创建字典类型变量
PyDict_SetItemString(pDict,"Name",Py_BuildValue("s","WangYao"));//往字典类型变量中填充数据
PyDict_SetItemString(pDict,"Age",Py_BuildValue("i",25));//往字典类型变量中填充数据
PyTuple_SetItem(pArgs,0,pDict);//0---序号将字典类型变量添加到参数元组中
//返回值
PyObject*pReturn=NULL;
pReturn=PyEval_CallObject(pFunc,pArgs);//调用函数
//处理返回值:
intsize=PyDict_Size(pReturn);
cout<<"返回字典的大小为:"<<size<<endl;
PyObject*pNewAge=PyDict_GetItemString(pReturn,"Age");
intnewAge;
PyArg_Parse(pNewAge,"i",&newAge);
cout<<"TrueAge:"<<newAge<<endl;

Py_Finalize();
}

//测试类
voidTestClass()
{
Py_Initialize();

PyObject*pMole=NULL;
PyObject*pFunc=NULL;
pMole=PyImport_ImportMole("Test001");//Test001:Python文件名
pFunc=PyObject_GetAttrString(pMole,"TestDict");//Add:Python文件中的函数名
//获取Person类
PyObject*pClassPerson=PyObject_GetAttrString(pMole,"Person");
//创建Person类的实例
PyObject*pInstancePerson=PyInstance_New(pClassPerson,NULL,NULL);
//调用方法
PyObject_CallMethod(pInstancePerson,"greet","s","HelloKitty");//s表示传递的是字符串,值为"HelloKitty"

Py_Finalize();
}
#test.py
defHelloWorld():
print"HelloWorld"
defadd(a,b):
returna+b
defTestDict(dict):
printdict
dict["Age"]=17
returndict
classPerson:
defgreet(self,greetStr):
printgreetStr
#printadd(5,7)
#a=raw_input("EnterToContinue...")


结果:


注意两点:

  1. 若编译Debug版,请将C:/Python26/libs下的python26.lib复制一份改名为python26_d.lib

  2. test.py 记得放项目的当前目录。


测试通过

‘陆’ 求助 关于c程序中嵌入Python的问题

在C/C++中嵌入Python也比较简单,首先需要在VC中添加Python的include文件目录和lib文件目录:
VC6.0下,打开 tools->options->directories->show directories for,将Python安装目录下的inlude目录添加到inlude files项中,将libs目录添加到library files项中。
VC2005下,打开tools->options->项目和解决方案->VC++目录,然后做相同工作。

代码如下:
//在debug下执行出错,“无法找到python31_d.lib文件”,后查到原因是:在debug下生成必须要有python31_d.lib文件,否则只能在release下生成
#include <python.h>
int main()
{
Py_Initialize();
PyRun_SimpleString("Print 'hi, python!'");
Py_Finalize();
return 0;
}

Py_Initialize函数原型是:void Py_Initialize(),在嵌入Python脚本时必须使用该函数,它初始化Python解释器,在使用其他的Python/C API之前必须先调用该函数。可以使用Py_IsInitialized函数判断是否初始化成功,成功返回True。
PyRun_SimpleString函数原型是int PyRun_SimpleString(const char *command),用来执行一段Python代码。注意:是否需要维持语句间的缩进呢?
Py_Finalize函数原型是void Py_Finalize(),用于关闭Python解释器,释放解释器所占用的资源。

PyRun_SimpleFile函数可以用来运行".py"脚本文件,函数原型如下:
int PyRun_SimpleFile(FILE *fp, const char *filename);
其 中fp是打开的文件指针,filename是要运行的python脚本文件名。但是由于该函数官方发布的是由visual studio 2003.NET编译的,如果使用其他版本的编译器,FILE定义可能由于版本原因导致崩溃。同时,为简便起见可以使用如下方式来代替该函数:
PyRun_SimpleString("execfile(‘file.py’)"); //使用execfile来运行python文件

Py_BuildValue()用于对数字和字符串进行转换处理,变成Python中相应的数据类型(在C语言中,所有Python类型都被声明为PyObject类型),函数原型如下:
PyObject *Py_BuildValue(const char *format, …..);
PyString_String()用于将PyObject*类型的变量转换成C语言可以处理的char*型,具体原型如下:
char* PyString_String(PyObject *p);

列表操作函数:
PyObject * PyList_New(Py_ssize_t len);
int PyList_SetItem(PyObject *list, Py_ssize_t index, PyObject *item);
PyObject * PyList_GetItem(PyObject *list, Py_ssize_t index);
int PyList_Append(PyObject *list, PyObject *item);
int PyList_Sort(PyObject *list);
int PyList_Reverse(PyObject *list);
Py_ssize_t PyList_Size(PyObject *list);

元组操作函数:
int PyTuple_New(Py_ssize_t len);
int PyTuple_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o);
PyObject * PyTuple_GetItem(PyObject *p, Py_ssize_t pos);
int _PyTuple_Resize(PyObject **p, Py_ssize_t newsize); //注意是**指针

字典操作函数:
PyObject * PyDict_New();
int PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val);
int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val);
PyObject* PyDict_GetItem(PyObject *p, PyObject *key);
PyObject* PyDict_GetItemString(PyObject *p, const char *key);
//与PyDict_SetItemString对应
int PyDict_DelItem(PyObject *p, PyObject *key);
int PyDict_DelItemString(PyObject *p, char *key);
//与PyDict_SetItemString对应
int PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue);
PyObject* PyDict_Items(PyObject *p);
PyObject* PyDict_keys(PyObject *p);
PyObject* PyDict_Values(PyObject *p);

在C/C++中使用Python对象应正确地处理引用计数问题,否则容易导致内存泄漏。当使用Python/C API中的函数创建列表、元组、字典等后,在对其完成操作后应该使用Py_CLEAR()和Py_DECREF()等宏来销毁这些对象。原型如下:
void Py_CLEAR(PyObject *o);
void Py_DECREF(PyObject *o);
其中,对于Py_CLEAR函数,参数可以为NULL指针,表示不进行任何操作,但是Py_DECREF函数不能为NULL指针,否则导致错误。

使用PyImport_Import()函数可以在C中导入Python模块,返回一个模块对象。函数原型为:
PyObject* PyImport_Import(PyObject *name);
PyMole_GetDict()函数可以获得Python模块中的函数列表,返回一个字典,字典中的关键字为函数名,值为函数的调用地址。原型如下:
PyObject* PyMole_GetDict(PyObject *mole);
使用PyObject_CallObject()函数和PyObject_CallFunction()函数可以在C中调用Python中的函数,原型如下:
PyObject* PyObject_CallObject(PyObject *callable_object, PyObject *args);
//args是元组形式
PyObject* PyObject_CallFunction(PyObject *callable, char *format, ……);
//format是类似”iss”这样的参数类型,后面是指定参数
可以使用PyCallable_Check(func)来判断是否可以调用函数,可以则返回True。

‘柒’ 怎样在oc代码中导入python的头文件

1. 安装Python开发包 由于需要访问Python/C API,首先安装Python开发包。 在Debian,Ubuntu或Linux Mint中: 在CentOS,Fedora或RHEL中: 安装成功后,Python头
2. 初始化解释器并设置路径 C中嵌入Python的第一步是初始化Python解释器,这可以用以下C函数完成。 初始化解释器后,需要设置你的C程序中要导入的Python模块
3. 数据转换 C中嵌入Python最重要的方面之一是数据转换。

‘捌’ LINUX下要在C中嵌入Python,编译的时候怎样解决库的连接问题

原因分析:
先看几个概念:
与外部库连接

外部库有两种:(1)静态连接库lib.a
(2)共享连接库lib.so
共同点:
.a, .so都是.o目标文件的集合,这些目标文件中含有一些函数的定义(机器码),而这些函数将在连接时会被最终的可执行文件用到。
区别:
静态库.a : 当程序与静态库连接时,库中目标文件所含的所有将被程序使用的函数的机器码被到最终的可执行文件中。
共享库.so : 与共享库连接的可执行文件只包含它需要的函数的表,而不是所有的函数代码,在程序执行之前,那些需要的函数代码被拷贝到内存中,这样就使可执行文件比较 小,节省磁盘空间(更进一步,操作系统使用虚拟内存,使得一份共享库驻留在内存中被多个程序使用)。共享库还有个优点:若库本身被更新,不需要重新编译与 它连接的源程序。

具体分析:
编译器会给出上述错误信息,这是因为sqrt函数不能与外部数学库"libm.a"相连。sqrt函数没有在程序中定义,也不存在于默认C库 "libc.a"中,应该显式地选择连接库。上述出错信息中的"/tmp/ccdzoSZq.o"是gcc创造的临时目标文件,用作连接时用。

‘玖’ 怎样把Python代码嵌入到C程序

步骤1:安装Python开发包
由于需要访问Python/C API,首先安装Python开发包。
在Debian,Ubuntu或Linux Mint中:
在CentOS,Fedora或RHEL中:
安装成功后,Python头文件在/usr/include/python2.7。根据Linux发行版的不同,确切的路径可能是不相同的。例如,CentOS 6中是/usr/include/python2.6。
步骤2:初始化解释器并设置路径
C中嵌入Python的第一步是初始化Python解释器,这可以用以下C函数完成。
初始化解释器后,需要设置你的C程序中要导入的Python模块的路径。例如,比如你的Python模块位于/usr/local/moles。然后使用以下C函数调用来设置路径。
步骤3:数据转换
C中嵌入Python最重要的方面之一是数据转换。从C中传递数据到Python函数,需要首先将数据从C数据类型转换到Python数据类型。Python/C API提供各种函数来实现这。例如,转换C字符串到Python字符串,使用PyString_FromString函数。
另外一个类似函数PyInt_FromLong,将C中long数据类型转换为Python int。每个Python/C API函数返回一个PyObject类型的引用。
步骤4:定义一个Python模块
当你想嵌入Python代码到另一种语言如C,该代码需要被写成Python模块,然后用另一种语言“导入”。所以让我们来看看如何在C中导入Python模块。
为了进行说明,我们实现一个简单的Python模块例子如下:
以上的Python函数有一个字符串作为参数并返回两个重复的字符串。例如,如果输入字符串是“cyberpersons”,该函数返回'cyberpersonscyberpersons'。此模块文件命名为“printData.py”并将它放在前面声明的Python模块目录中(/usr/local/moles)。
步骤5:加载一个Python模块
现在你已经定义了Python模块,是时候在C程序中加载它了。导入模块的C代码看起来像这样:
步骤6:构建函数的参数
当加载一个模块时,可以调用模块中定义的Python函数。通常,我们需要传递一个或多个参数到一个Python函数。我们必须构建一个Python元组对象,它包括Python函数中的参数。
在我们的例子中,printData函数定义带一个参数的模块。因此,我们构建一个大小是一的Python元组对象如下。我们可以使用PyTuple_SetItem设置元组对象的每个项。
我们已经成功构建一个参数传递到函数调用,是时候从C程序调用python函数了。
步骤7:调用Python函数
一旦成功创建Python元组对象作为函数参数,我们可以调用一个带参数的Python函数。为此,通过使用PyObject_GetAttrString首先获得模块中定义的函数的引用,然后使用PyObject_CallObject调用该函数。例如:
步骤8:错误检查
避免运行时错误的常见方法是检查函数的返回值并根据返回值采取适当的行动。类似于C程序中的全局变量errno,Python/C API提供一个全局指示符,它报告最后发生的错误。当Python/C API函数失败,全局指示符设置为指示错误,并且PyErr_Print可以用于显示相应的人类可读的trackback。例如:

在你的应用程序中,你可以轻松地将各种错误检查。
这里是完整的C程序,它如本教程描述的嵌入Python代码。

步骤9:编译和执行
保存以上代码到finalCode.c,并且链接Python库(-lpython2.7)编译该代码。根据发行版的不同,可能使用不同的版本(例如,-lpython2.6)。

‘拾’ c可以调用python吗

可以的。

C中内嵌Python
新建立一个工程,首先需要将工作目录设置到Python-3.1.1PCbuild中,以获取到动态库,至于静态库的包含,Include目录的指定,那自然也是少不了的。文件中需要包含Python.h文件,这也是必须的。
接口中
Py_Initialize();
Py_Finalize();

其他的根据需求,再引入相应的python builder 即可

热点内容
随机启动脚本 发布:2025-07-05 16:10:30 浏览:517
微博数据库设计 发布:2025-07-05 15:30:55 浏览:20
linux485 发布:2025-07-05 14:38:28 浏览:299
php用的软件 发布:2025-07-05 14:06:22 浏览:751
没有权限访问计算机 发布:2025-07-05 13:29:11 浏览:428
javaweb开发教程视频教程 发布:2025-07-05 13:24:41 浏览:690
康师傅控流脚本破解 发布:2025-07-05 13:17:27 浏览:235
java的开发流程 发布:2025-07-05 12:45:11 浏览:681
怎么看内存卡配置 发布:2025-07-05 12:29:19 浏览:279
访问学者英文个人简历 发布:2025-07-05 12:29:17 浏览:828