c嵌python
『壹』 怎麼樣才能在c程序中嵌入python而不用依賴系統安裝的python而運行。也說是說怎麼把pyth
這個思路不是很行得通。。建議題主再思考一下程序結構。
為何要在C程序中嵌入python呢?
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...")
結果:
注意兩點:
若編譯Debug版,請將C:/Python26/libs下的python26.lib復制一份改名為python26_d.lib
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 即可