python與C混編的執行邏輯

2021-08-29 00:09:26 字數 1314 閱讀 1745

之前遇到過乙個c語言呼叫python的問題,是載入python版本可以在初始化前設定,如果不設定,會使用預設路徑/usr/bin/python.

設定方法為在py_initialize呼叫前使用py_setprogramname,即可呼叫指定版本的python

當然還有乙個問題,就是寫了乙個python指令碼load了呼叫python的c模組,

問題描述

python模組module1

在c中呼叫module1模組的c**模組module2

python**main.py呼叫了module2

執行命令

python main.py
簡單執行執行流程main.py -> module2 -> module1

加入**的執行流程

上面module2只執行一遍,現在為了讓module不停的載入銷毀引入while迴圈

while

true

: new module2(

) module2.foo(

) delete module2

問題出現,提示double free or corruption (!prev)

檢視堆疊,目標暫存器為0x00,明顯是寫越界,為什麼目標位址是null

問題原因

在python呼叫c時,py_initialize不會在c中執行,所以無法py_setprogramname(當然這是另外乙個問題)。

在我的**中,new module2()時,會根據py_isinitialized判斷python有沒有初始化,決定是否初始化module1中使用的ctypes變數,因為while迴圈中destory了ctypes變數,但是py_initialize卻不會再次呼叫(python作為main入口,module2中及時顯示呼叫py_initialize也沒用),導致這些變數重複free。

小結python作為main入口,所使用的c模組中及時顯示呼叫py_initialize,py_setprogramname等函式也是無效的。

C與C 的混編方法

0 約定 c檔案使用gcc編譯,cpp檔案使用g 編譯,生成對應的object檔案 g 也可以編譯c檔案,但是預設編譯出來的符號是以c 方式 我們可以指定extern c 或者 extern c 來指定編譯的時候函式是以c或者c 方式修飾 使用g 編譯需要嚴格型別檢查,所以對於c檔案,盡量還是用gc...

c 與IDL混編問題

將原有的idl計算模組整合到新的環境中後在計算的時候出錯 attempted to read or write protected memory.this is often anindication that other memory is corrupt.跟蹤 發現getnameddata獲取狀態...

Makefile C與C 混編的簡單寫法

目錄結構 socket中是基本的socket類,except是捕捉異常類,include 是標頭檔案,basetype.h等,主程式檔案在當前目錄 target 目標檔案 obj dir this 中間檔案存放目錄 compile.cpp和compile.c 編譯 source paths 原始碼....