使用C呼叫Python,混合程式設計筆記

2021-09-06 23:23:47 字數 2290 閱讀 6686

目的

1.由於微博網頁結構再次更新導致之前的微博爬蟲版本已經不能使用,所以對python爬蟲進行了一次更新

2.學習下如何使用python與c進行互動,即如何將python嵌入c++程式中

3.記錄下進行此項工程時遇到的幾個坑,以及如何結果/規避

前段時間實習工作的時候有聽過electron架構,本來是想學習一波的,但是由於對nodejs了解實在太少,想進行下去難度還是挺大的,不過如果是python和c結合的話應該沒啥問題,於是就開始這個小專案啦

tips:

1.python檔案的main函式會在匯入時執行,最好別有main函式/穩定執行的**,避免不必要的時間浪費

2.學習python/c api最好的地方當然是他們的官方文件啦,選擇合適的python版本,檢視api介紹即可,附上**:python/c api reference manual

使用c++呼叫python模組的流程:

設定好工程選項

first : 確保編譯的exe版本需要和安裝的python版本對應,即若你安裝的是x64的python則只能生產x64的exe

second : python與c互動主要用到的是python/c的相關api,這個api基本都存在於…/python27/include類似這樣的檔案目錄下,一定要把這個目錄新增到附加包含目錄中去

third : 需要包含 python27.lib/python36.lib 檔案,**中要手動新增,然後再將此檔案複製到工程目錄下,同時再複製乙個副本改名為python27_d.lib/python36_d.lib 以便debug模式使用

初始化python虛擬機器環境

py_setpythonhome("c:\\python27"); //這裡設定python.exe所在的目錄

py_initialize(); //初始化python虛擬機器

pymodule = pyimport_importmodule((const char *)"pythonspider"); //匯入你寫的python模組

/*異常處理根據實際情況編寫*/

從模組中匯入你所需呼叫的函式

pyobject* pycatchweibocontent = pyobject_getattrstring(pymodule, "catchweibocontent");
將c型別的物件轉換為python型別的物件準備傳給python作為引數

pyobject* pyparam = py_buildvalue("(s)", "123456789advvv");
帶參呼叫獲取的函式並取得返回值

pyobject* pycontent = pyobject_callobject(pycatchweibocontent, pyparam);
根據實際情況將pyobject物件轉為c型別

pyarg_parse()/pyarg_parsetuple()...
幾個較難解決的問題

//使用pylist_size()獲取返回的列表大小

commentslistlen = pylist_size(pylist);

//使用pylist_getitem()獲取列表元素

pyobject* tempitem = pylist_getitem(pylist, index);

//按照常規方式進行型別轉換

編碼問題

python3的話預設為utf-8編碼,與c的編碼方式不一導致亂碼問題

不太好解決,所以這裡吧python3切換為python2版本然後開頭確定編碼格式為gb18030,

同時確保.py檔案本身的編碼也是如此。就可解決中文亂碼問題

pyimport_importmodule返回null

import requests

用python單獨匯入時並沒有出錯,但是使用c匯入此python模組時出錯了,報的錯誤資訊是:

importerror: cannot import name _remove_dead_weakref

解決方式....並沒有好的解決方式 2.7.14~2.7.12都會出現此問題,換成2.7.10就沒問題了

c呼叫c c 呼叫c的混合程式設計

c與c 混合程式設計 1.c 調c c 呼叫c函式是最簡單的,直接調即可。在c.h標頭檔案,加巨集定義,告訴用gcc編譯就好。ifdef cplusplus extern c endif2.c呼叫c c呼叫c 函式,相對複雜。c 標頭檔案需要以下這麼做 作為中間的標頭檔案 ifdef cpluspl...

Matlab C混合程式設計(Matlab呼叫C)

類似matlab的指令碼語言的最大詬病就是執行速度慢,而c的編寫難度大,但執行速度快,所以用matlab呼叫c可以很好的互補。用matlab呼叫c語言如下,其中mexfunction是乙個介面函式,用來溝通matlab與c語言之間的程式設計代溝。nlhs 輸出引數數目 left hand side ...

c 和Python混合程式設計

1.設定環境 1 在vs的附加包含目錄中新增python的include路徑 2 在vs linker的附加庫目錄中新增python的libs路徑 3 注意,如果安裝的python是64位的,那麼vs工程也要是一直對應的x64活動平台,否則會報 無法解析的外部符號 imp py initialize...