- 1、如何發佈vc調用Python的獨立運行的程序
- 2、求助 關於c程序中嵌入Python的問題
- 3、vc 中如何運行
- 4、python可以包vc程序嘛
- 5、c++調用python
- 6、vc++調用python傳遞參數
譯Python腳本生成可執行程序,可以通過py2exe編譯完成。
在VC中調用python時,可以結合py2exe,完成整個程序的獨立發佈
google.py:
#! /usr/bin/env python
import sys, webbrowser
def main(a):
url = “” % a
webbrowser.open(url)
在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);
PyModule_GetDict()函數可以獲得Python模塊中的函數列表,返回一個字典,字典中的關鍵字為函數名,值為函數的調用地址。原型如下:
PyObject* PyModule_GetDict(PyObject *module);
使用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。
在VC中編譯、運行程序的小知識點
VC建立項目時總會定義”Win32″。控制台
LINK的時候需要指定/subsystem,這個鏈接選項告知Windows如何運行可履行文件。
Python可以調用VC的模塊。
Python調用C++在Python腳本里添加其中ctypes是Python的一個庫,提供和C語言兼容的數據類型,可以很方便地調用CDLL中的函數。運行以上腳本得到:顯示調用C++程序成功。
採用這個方法,我們不用進行大量的改寫,也能在Python中使用我們積累的各種C++程序了。
要搞明白如何讓python調用C/C++代碼(也就是寫python的extension),你需要征服手冊中的Extending embedding厚厚的一章。在昨天花了一個小時看地頭暈腦脹,仍然不知道如何寫python的extension後,查閱了一些其他書籍,最終在Python Programming On Win32書中找到了教程。1. 首先要明白的是,所謂的python擴展(也就是你提供給python的c/c++代碼,不一定是c/c++代碼,可以是其他語言寫的代碼)是一個dll,並且這個dll放在本機python安裝目錄下的DLLs目錄下(譬如我機器上的路徑是:F:/Program Files/Python25/DLLs),假如我們接下來要寫的擴展module名為mb,python調用的代碼為:import mbmb.showMsg(“Python’s really amazing, I kindda love it!”)2. 搭建環境,我們要使用python提供的c頭文件和lib庫來進行擴展的開發。在vs 2005下點擊菜單 “工具”-“選項”, 打開選項對話框,選擇”項目和解決方案-VC++目錄”, 然後在右邊”顯示以下內容的目錄”得comboBox上選擇”包含文件」,添加python的include目錄(我的機器上是”F:/Program Files/Python25/include”),然後選擇庫文件,添加python的libs目錄(我的機器上是”F:/Program Files/Python25/libs”)。既然擴展是一個dll,接下來我們要建立一個「動態鏈接庫」工程,然後開始寫代碼:#include python.h //python.h是包含python一些定義的頭文件,在python的include目錄下/*我的python版本是2.5, 因為安裝python後它沒提供debug下的lib庫文件,因此你必須生成release版的dll,想要生成dll版本的,你要到python官網上自己去下載python源代碼,當然你可以繼續生成release版本的dll,但dll中包含調試信息*/#pragma comment(lib, “python25.lib”)//先不管static PyObject* mb_showMsg(PyObject* self, PyObject *args);/*如果你的擴展是mb,那麼必須實現一個initmb函數,並且從dll中導出這個函數,但我們在python中調用import mb時,python會去dll里去調用extern “C” __declspec(dllexport) void initmb(){/*當調用mb.showMsg(“Python’s really amazing, I kindda love it!”)時, 相當於你告訴python我有一個showMsg函數,我們怎麼告訴python去調用我們dll里的mb_showMsg函數呢?技巧就是下面的方式,定義一個字典數據結構,key = showMsg, value =mb_showMsg,METH_VARARGS是函數調用方式,仔細查手冊吧*/static PyMethodDef mbMethods[] = {{“showMsg”, mb_showMsg, METH_VARARGS},{NULL, NULL, NULL} /*sentinel,哨兵,用來標識結束*/};//告訴python我們的模塊名叫mb, 模塊包含的函數都在mbMethods字典里PyObject *m = Py_InitModule(“mb”, mbMethods);}/*接下來實現核心功能showMsg*///第一個self參數我們用不着,具體查手冊,第二個參數是python傳給我們的參數,它是一個python的參數tuplestatic PyObject* mb_showMsg(PyObject* self, PyObject *args){//我們的showMsg函數需要的是一個字符串參數const char* msg = NULL;/*調用特殊參數解碼python傳遞給我們的參數,s是string,我們傳遞接收參數的變量地址,如果你的功能函數需要兩個參數,在PyArg_parseTuple後面繼續添加接受參數的變量地址,這個函數的原型是類似printf的不定參數的形式PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, …);*/if (!PyArg_ParseTuple(args, “s”, msg))return NULL;//調用MBint r = ::MessageBox(NULL, “hello”, “Caption:Form C module”, MB_ICONINFORMATION | MB_OK);//返回值return Py_BuildValue(“i”, r);}將上面這段混雜着大量注釋的代碼拷貝到你的編輯器里,然後編譯生成mb.dll,修改後綴成mb.pyd,然後拷貝到python的DLLs目錄下,打開idle(python的交互程序),寫入代碼:import mbmb.showMsg(“Python’s really amazing, I kindda love it!”)
請採納。
建議把python腳本作成命令行傳參,這樣在C++中只需要用一個system函數就可以調用了。
原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/126210.html