Python 本身就是一个C库。你所看到的可执行体python只不过是个stub。真正的python实体在动态链接库里实现,在Windows平台上,这个文件位于 %SystemRoot%\System32\python27.dll。
你也可以在自己的程序中调用Python,看起来非常容易:
//my_python.c
#include <Python.h>
int main(int argc, char *argv[])
{
Py_SetProgramName(argv[0])
Py_Initialize()
PyRun_SimpleString("print 'Hello Python!'\n")
Py_Finalize()
return 0
}
在Windows平台下,打开Visual Studio命令提示符,编译命令为
cl my_python.c -IC:\Python27\include C:\Python27\libs\python27.lib
在Linux下编译命令为
gcc my_python.c -o my_python -I/usr/include/python2.7/ -lpython2.7
在Mac OS X 下的编译命令同上
产生可执行文件后,直接运行,结果为输出
Hello Python!
Python库函数PyRun_SimpleString可以执行字符串形式的Python代码。
虽然非常简单,但这段代码除了能用C语言动态生成一些Python代码之外,并没有什么用处。我们需要的是C语言的数据结构能够和Python交互。
下面举个例子,比如说,有一天我们用Python写了一个功能特别强大的函数:
def great_function(a):
return a + 1
接下来要把它包装成C语言的函数。我们期待的C语言的对应函数应该是这样的:
int great_function_from_python(int a) {
int res
// some magic
return res
}
首先,复用Python模块得做‘import’,这里也不例外。所以我们把great_function放到一个module里,比如说,这个module名字叫 great_module.py
接下来就要用C来调用Python了,完整的代码如下:
#include <Python.h>
int great_function_from_python(int a) {
int res
PyObject *pModule,*pFunc
PyObject *pArgs, *pValue
/* import */
pModule = PyImport_Import(PyString_FromString("great_module"))
/* great_module.great_function */
pFunc = PyObject_GetAttrString(pModule, "great_function")
/* build args */
pArgs = PyTuple_New(1)
PyTuple_SetItem(pArgs,0, PyInt_FromLong(a))
/* call */
pValue = PyObject_CallObject(pFunc, pArgs)
res = PyInt_AsLong(pValue)
return res
}
从上述代码可以窥见Python内部运行的方式:
所有Python元素,module、function、tuple、string等等,实际上都是PyObject。C语言里操纵它们,一律使用PyObject *。
Python的类型与C语言类型可以相互转换。Python类型XXX转换为C语言类型YYY要使用PyXXX_AsYYY函数;C类型YYY转换为Python类型XXX要使用PyXXX_FromYYY函数。
也可以创建Python类型的变量,使用PyXXX_New可以创建类型为XXX的变量。
若a是Tuple,则a[i] = b对应于 PyTuple_SetItem(a,i,b),有理由相信还有一个函数PyTuple_GetItem完成取得某一项的值。
不仅Python语言很优雅,Python的库函数API也非常优雅。
现在我们得到了一个C语言的函数了,可以写一个main测试它
#include <Python.h>
int great_function_from_python(int a)
int main(int argc, char *argv[]) {
Py_Initialize()
printf("%d",great_function_from_python(2))
Py_Finalize()
}
编译的方式就用本节开头使用的方法。
在Linux/Mac OSX运行此示例之前,可能先需要设置环境变量:
bash:
export PYTHONPATH=.:$PYTHONPATH
csh:
setenv PYTHONPATH .:$PYTHONPATH
C语言难,Python简单。Python上手简单有交互性强的开放环境,还有众多的第三方库,学习起来要比C语言容易很多而C语言底层强在内存操作,功能实现起来却十分复杂并不适合新手作为上手语言。Python和C语言各有各的优势,Python语法非常特殊,Python是由空格严格控制的,这对于刚接触编程的人来说并不好如果你用C语言开始编程,可以更好地掌握编程基础,理解代码操作原理,但是学习起来很枯燥,会阻碍你的学习,所以建议从Python语言开始学习。
对比C语言,Python不仅简单、语法清晰,而且前景好、岗位多、薪资待遇高、就业范围广,绝对是0基础的首选。
Python和C语言有什么区别呢?来自于四点:
语言不同。C语言是一种编译的语言,而Python是脚本语言
全局变量方面。Python中,我们需要引用别的模块C语言中,需要在头部使用include去引入
状态不同。C语言是静态语言,而Python是动态语言
数组和list不同。C语言中的数组里面都是数字,而list包含很多不同的元素。