在windows上擴充套件python

2021-04-26 06:52:35 字數 3226 閱讀 3600

在windows環境下建立乙個python的模組。 使用vc6和python2.3

先講講做簡單的步驟

1。 在vc6中建立乙個dll的project。 假定我們的module的名字是mytest.那麼我們的dll名字就是mytest.dll。 這個是必須的。

2。 用c寫我們想要實現的部分。步驟如下

#include 這個是必須的。python的型別都在這裡定義。類似寫window程式一定要包含windows.h一樣。所以,在vc裡一定要設定

好include的路徑。這個檔案在 python23/include/下面。

4。 寫我們想要實現的函式。比如我們想要實現兩個c的函式,strlen和strcat。我們必須分別包裝他們。命名為my_strlen和my_strcat。

先宣告:

static pyobject* my_strlen(pyobject *self, pyobject *args);

static pyobject* my_strcat(pyobject *self, pyobject *args);

一定宣告為static,把他們限制在這個檔案範圍裡。

幾乎所有的引數都是pyobject型別。 在python,每個東西都是object。

這兩個函式的定義是這樣的:

static pyobject* my_strlen(pyobject *self, pyobject *args)

static pyobject* my_strcat(pyobject *self, pyobject *args)

第乙個引數是self,這個是python用的, 每個函式都要有。我們暫時不管。args是乙個引數列表。她把所有的引數都整合成乙個string。所以

我們需要從這個string裡來解析我們的引數。

pyarg_parsetuple來完成這個任務。第乙個引數是args, 就是我們要轉換的引數。第二個是格式符號。「s」代表是個string。 從args裡

提取乙個引數就寫"s", 兩個的話就寫"s|s", 如果是乙個string,乙個int,就寫"s|i", 和printf差不多。第三個引數就是提取出來的

引數放置的真正位置。必須傳遞這個引數的位址。對於my_strcat, 他將提取兩個引數。分別是string1和string2。

然後呼叫真正的我們的實現。分別是strlen和strcat。

呼叫完之後我們需要返回結果。這個結果是c的type或者是我們自己定義的型別。必須把他轉換成pyobject, 讓python認識。這個用py_buildvalue

來完成。他是pyarg_parsetuple的逆過程。他的第乙個引數和pyarg_parsetuple的第二個引數一樣, 是個格式化符號。第三個引數

是我們需要轉換的引數。py_buildvalue會把所有的返回只組裝成乙個tutple給python。

實際上,我們只是把我們想要實現的部分呼叫python提供的api來封裝了一下。但是python並不知道怎麼用這些函式。

我們還需要做一些工作。

static pymethoddef mytestmethods =

, ,

}; 這個是乙個c的結構。他來完成乙個對映。 我們需要把我們擴充套件的函式都對映到這個表裡。表的第乙個欄位是python真正認識的。是python

裡的方法名字。 第二個欄位是python裡的這個方法名字的具體實現的函式名。 在python裡呼叫mystrlen, 真正執行的是用c寫的

my_strlen函式。第三個欄位是meth_varargs, 他告訴python,mystrlen是呼叫c函式來實現的。第四個欄位是這個函式的說明。如果你在

python裡來help這個函式,將顯示這個說明。相當於在python裡的函式的文件說明。

我們建立了這個對映表。這個表是在python匯入我們的這個module的時候來用的。但是python 是如何來呼叫這個表的呢。他通過這個函式

_declspec(dllexport) void initmytest()

注意,這個函式的名字不能改動。 必須是init+模組名字。 我們的模組名字是mytest。所以這個函式是initmytest()。 這個函式應該被

匯出。所以使用 _declspec(dllexport)。 這樣python在匯入mytest 的模組時候,才會找到這個函式,並呼叫。這個函式呼叫py_initmodule來將模組名字和對映表結合在一起。

他表示,mytest這個模組使用 mytestmethods這個對映表。python應該這樣匯入我們的module的:

a. 當我們import mytest的時候。 python裝載這個module的dll。 在這裡是mytest.dll

b. 然後在這個dll裡呼叫, initmytest函式來建立乙個對映表。 如果這個initmytest函式不實現或者沒有匯出。就不能成功把這個module

匯入到python裡。

c. python 從對映表 知道這個模組實現了幾個方法。並且名字分別是什麼。當呼叫他們的時候,找到相應的c的函式。

寫完這些**以後,我們可以在vc6裡編譯這個dll, 注意,必須編譯成release版本。並且鏈結python23.lib。 如果是debug版本

他將會找python23_d.lib。編譯的dll名字是mytest.dll。如果不是的話,在vc裡改動link的設定。

把mytest.dll拷到python23的lib目錄下,或者python能搜尋到的路徑下。 進入python的shell

>>import mytest.dll

>>mytest.mystrlen("123")

3 >>mytest.mystrcat("123", "456")

123456

#include static pyobject* my_strlen(pyobject *self, pyobject *args);

static pyobject* my_strcat(pyobject *self, pyobject *args);

static pymethoddef mytestmethods =

, ,

};static pyobject* my_strlen(pyobject *self, pyobject *args)

static pyobject* my_strcat(pyobject *self, pyobject *args)

_declspec(dllexport) void initmytest()

charles在mac上抓取本地python請求

1.首先開啟charles,在proxy中開啟macos proxy,這樣才能抓取本地請求 2.python 中,post get請求中新增verify false忽略ssl認證,否則會報caused by sslerror sslerror 1,ssl certificate verify fai...

MinGW lapack 在windows 上安裝

方案一 mingw makefiles 配置好以後直接在build資料夾下,執行cmd.exe shell,mingw32 make j5,之後執行mingw32 make install 安裝檔案到c program files x86 lapack,勾選build shared libs 方案二...

PHPXhprof擴充套件在windows安裝

注意 一定要找對應的php版本,ts和nts版本 2.安裝,這步驟很簡單,把xhprof 的dll檔案重新命名為 php xhprof.dll 放在php的ext目錄下,然後在php.ini配置裡面加入配置,不要忘記建立對應的日誌輸出資料夾,如下 1 xhprof 2 extension php x...