歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C語言嵌入Python

1.為什麼要嵌入python?

這個問題問的好,一般靜態語言與腳本語言(不僅僅是python),相互搭配,有兩種方式,一種是用c語言寫好模塊,然後用python去整合,也被稱之為擴展python,這樣的好處是即有python的靈活性,又有c語言的效率,還有一種就是c語言嵌入python,這樣我們就有了一個python解釋器了,在游戲編程中常用這種方法,如果你是用靜態語言編程,那麼修改一些屬性,就意為著重新編譯,如果程序很大的話,編譯是一間令人很煩的事,編譯起來非常慢,一種好的設計是把一些屬性寫在一個初始化文件中,然後在程序中去解析這個屬性文件,不過這樣還是不夠靈活,更加靈活的方式,就是干脆嵌入python(游戲編程中常用lua),這樣,游戲更有創造性,更容易擴展。

2.一個"錯誤的"例子

下面先把C代碼寫出來,(當然,直接編譯肯定是錯的,因為我們還有許多東西沒設置)

main.c

#include <Python.h>
int main()
{

Py_Initialize();
PyRun_SimpleString("print 'hello,python!'");
Py_Finalize();

return 0;
}

Py_Initialize()和Py_Finalize()就是初始化和結束python解釋器,PyRun_SimpleString()就在運行一段python語句,(好像表達式不行...)

你一定覺得你沒有Python.h這個頭文件,所以你不得不安裝一個叫python-dev的東西,直接sudo apt-get python-dev好了

現在我們試著編譯一下,

gcc -o main.c main

編譯錯誤,它找不到Python.h,它當然找不到,我們雖然已經下載安裝了,但是gcc並不能找到,我們需要告訴它,這就要用到gcc 的 -I選項

"-I 在頭文件的搜索路徑列表中添加dir目錄。" --- man 關於gcc -I選項的說明

我們繼續嘗試編譯:

gcc -I/usr/include/python2.6 main.c -o main

然後你會看到一大堆的錯誤

undefined reference to

恩,鏈接錯誤,他們並沒有找到庫的實現

你需要這樣編譯

gcc -I/usr/include/python2.6 -lpython2.6 main.c -o main

這次就沒問題了。

實際上我們更常見的做法是寫一個python模塊,然後導入,調用它,

看這個代碼:

Test.py

def hello():
    print "nihao"

main.c

#include <Python.h>
#include <stdio.h>
int main()
{
    Py_Initialize();

    PyObject *pModule = NULL;
    PyObject *pFunc  = NULL;

    pModule = PyImport_ImportModule("Test");
    pFunc  = PyObject_GetAttrString(pModule, "hello");
    PyEval_CallObject(pFunc,NULL);
    Py_Finalize();

    return 0;
}

Copyright © Linux教程網 All Rights Reserved