vc調用python程序(vc code怎麼運行Python)

  • 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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
簡單一點的頭像簡單一點
上一篇 2024-10-03 23:07
下一篇 2024-10-03 23:07

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29

發表回復

登錄後才能評論