从C运⾏Python程序的三种⽅法
⼀个经常出现的问题是:如何从我的C程序中调⽤Python? 有很多⽅法,所以让我们回顾其中的三种。
系统⽅法
我们可以使⽤系统函数从C程序调⽤Python,这基本上意味着,我们确实需要⼀个已编写的python程序,或者您需要使C程序将python程序写⼊磁盘。 这是⼀个简单的⽰例:
#include <stdio.h>
int main(){
char *prg = (char*)"print \"hello from python\"\n";
FILE *f= (FILE*)fopen("test2.py","w");
fprintf(f, prg);
fclose(f);
system("python test2.py");
}
假设程序已保存为test2.c,则可以通过以下⽅式进⾏编译:
gcc test1.c
然后,您将像这样运⾏它:
./a.out
这种⽅法的坏处是; 如果我们要在python中做任何事情,并且希望Python输出⼀些可以在C语⾔中处理的东西怎么办? 我们可以将Python程序写⼊⽂件,然后让C程序从Python程序中读取输出的⽂件,但是随后您必须对python程序进⾏⼀些修改,并且会有很多⽂件,结果浮动在您的硬盘驱动器上(好像还没有⾜够的空间!)
过程⽅法
让我们创建⼀个玩具程序,我们想在Python中添加两个数字,这些数字是从C程序给我们的。 因此,C程序将为我们提供两个数字,然后将这两个数字发送给Python程序,并通过printf命令从C程序写⼊结果。
#include <stdio.h>
#include <stdlib.h>
int main(){
int number1 = 10;
int number2 = 32;
int number3 = -1;
/* the python program as a C string */
char *prg = (char*)"import sys\nprint int(sys.argv[1])+int(sys.argv[2])\n";
/* make a C string which call Python */
char *input = (char*)malloc(sizeof(100)*sizeof(char));
/* a C string which will store the results */
char *input2 = (char*)malloc(sizeof(100)*sizeof(char));
FILE *f= (FILE*)fopen("test2.py","w");
fprintf(f, prg);
fclose(f);
sprintf(input,"python test2.py %d %d",number1,number2);
f = popen(input,"r");
fgets(input2,100,f);
fclose(f);
number3 = atoi(input2);
printf("%d\n",number3+10);
在这⾥,我们使⽤popen打开⼀个进程,在这种情况下,该进程恰好是运⾏我们定义为C字符串的程序的python解释器。 我们可以读取该过程的结果,在本例中为42。然后使⽤atoi将字符串转换为int。
假设程序已保存为test2.c,则可以通过以下⽅式进⾏编译:
gcc test2.c
然后,您将像这样运⾏它:
./a.out
嵌⼊式⽅法
如果您的设备没有操作系统怎么办? 或者,也许您不想让程序⼲扰您的操作系统? ⼀种可能性是将python嵌⼊到C程序中。 现在,“嵌⼊”实际上是什么意思? 好吧,这意味着使解释器成为C程序的⼀部分
⾸先,您使⽤哪种系统? (您可能会在Windows的最后⼀节中停下来,因为我不认为popen在Windows api中称为popen)。
假设您正在使⽤Ubuntu或类似的东西。 ⾸先,我们需要弄清楚⽤于将Python编译和嵌⼊到C程序中的标志。 包含⽂件在哪⾥,库⽂件在哪⾥?
我⾸先弄清楚我的系统上运⾏哪种Python
python --version
哪个返回:
Python 2.6.5
现在,我想弄清楚.h⽂件在哪⾥,所以我输⼊:
到Python.h
返回:
/usr/include/python2.6/Python.h
然后我想到库⽂件(基本上是python解释器):
定位libpython2.6.a
/usr/lib/python2.6/config/libpython2.6.a
然后,我得到了我需要的所有东西,现在,让我们确保在执⾏任何其他操作之前,我们已经完成了此⼯作。
我们从制作⼀个空的C程序开始
#include <Python.h>
#include <stdio.h>
int main(){
}
我们可以编译吗? 让我们将其保存为test3.c
gcc -I / usr / include / python2.6 / -L / usr / lib / python2.6 / config / -lpython2.6 test3.c
奏效了吗? 如果是,那么让我们继续在test3.c中使⽤Python程序制作⼀个有趣的C语⾔。 该程序应执⾏其先前的操作; 我们有两个数字(number1和number2),我们希望python将这两个数字相加,然后我们要在Python中获得相加的结果并将其放在C中名为number3的变量中
#include <stdio.h>
#include <Python.h>
int main(){
int number1 = 10;
python怎么读取py文件int number2 = 32;
Py_Initialize();
char *input = (char*)malloc(sizeof(100)*sizeof(char));
sprintf(input,"number3 = %d + %d",number1,number2);
PyRun_SimpleString(input);
PyObject * module = PyImport_AddModule("__main__");
PyObject * dictionary = PyModule_GetDict(module);
PyObject * result = PyDict_GetItemString(dictionary, "number3");
long number3 = PyInt_AS_LONG(result);
printf("%d\n",(int)number3);
Py_Finalize();
}
您通常将其运⾏为:
./a.out
在这种情况下,我们不需要将Python单独调⽤,因为Python已经是您C程序的⼀部分。 现在您应该使⽤哪⼀个? 编译C程序时,必须格外⼩⼼嵌⼊式版本的缺点。 优点是您不会⼲扰计算机上的进程,也不会将⽂件写⼊硬盘驱动器等。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论