Python C語言擴充套件

2021-08-22 03:32:15 字數 2698 閱讀 5845

這裡編寫個簡單例子來說明下具體是如何操作的:

建立dll專案,結構如下:

test/

----mydll.h

----mydll.c

標頭檔案:mydll.h

#ifndef __mydll_h__

#define __mydll_h__

#ifdef build_dll

#define dll_export __declspec(dllexport)

#else

#define dll_export __declspec(dllimport)

#endif

#ifdef __cplusplus

extern "c"

#endif

#endif // __mydll_h__

c檔案:mydll.c

#include "mydll.h"

dll_export int __stdcall foo(int x)

如果你安裝了code::blocks(和mingw),那麼建立環境變數:

mingw_home="c:\program files\codeblocks\mingw"

path=%mingw_home%\bin;%path%

開啟命令列,進入我們的專案路徑中:

d:\test>

#執行編譯命令

d:\test>mingw32-gcc -c -dbuild_dll mydll.c

#執行鏈結命令,生成mydll.dll和靜態庫檔案libmydll.a

d:\test>mingw32-gcc -shared -o mydll.dll mydll.o -wl,--kill-at,--out-implib,libmydll.a

以上,就是我們生成dll的全過程了。

用python測試下:

>>> import ctypes

>>> mydll = ctypes.windll.loadlibrary("d:\\test\\mydll.dll")

>>> print mydll.foo(10)

10mingw在vista中執行時cannot exec `cc1'問題:

假設環境變數path已經設定了mingw路徑為c:/mingw/bin;

但是在make時無法正確執行,出現:

g++: installation problem, cannot exec `cc1plus'

:no such file or directory

解決方法:

將c:/mingw//libexec/gcc/mingw32/

3.4.5/的 cc1和cc1plus兩個檔案

複製至c

:/mingw/bin

mingw在vista中執行時cannot exec `cc1』問題:

假設環境變數path已經設定了mingw路徑為c:/mingw/bin;

但是在make時無法正確執行,出現:

g++: installation problem, cannot exec `cc1plus』: no such file or directory

解決方法:

將c:/mingw//libexec/gcc/mingw32/3.4.5/的 cc1和cc1plus兩個檔案

複製至c:/mingw/bin

password.c

#include "password.h"

dll_export char* __stdcall foo(char *x)

temp[i]=*(x+i);

}temp[sizex]="\0";

return temp;

//return x;

}

password.h

#ifndef __password_h__

#define __password_h__

#ifdef build_dll

#define dll_export __declspec(dllexport)

#else

#define dll_export __declspec(dllimport)

#endif

#ifdef __cplusplus

extern

"c"

#endif

#endif // __password_h__

test.py

import os

import ctypes

from ctypes import c_char_p

deftests

(): os.chdir(r'c:\documents and settings\administrator\桌

面\2018-08-02')

pa=ctypes.windll.loadlibrary('password.dll')

print(pa.foo(c_char_p(b'abc')))

return pa

pa=tests()

print(pa.foo(c_char_p(b'abcd')))

rst=ctypes.string_at(pa.foo(c_char_p(b'abcd')),-1)

print(rst.decode('utf-8'))

python c模組擴充套件及PyIntObj物件

這是一篇 python原始碼剖析 的閱讀筆記。原始碼位置 python中一些模組是用c來實現的,所以我們也可以用c來實現一些自定義模組。在讀 python原始碼剖析 的過程中,使用一些自定義的模組可以很方便的了解其中一些原理,而不用每改一行 都得編譯整個python的原始碼。用c實現自定義模組的流程...

Python C擴充套件實踐 效能對比

因為效能等一些原因,希望用c來擴充套件python。有多種方法,例如 這裡闡述最後一種方式的實現。首先需要 include 需要實現下面三個函式 static pyobject funcname pyobject self,pyobject args 函式定義 static pymethoddef ...

c語言 python C語言和python的區別

python可以說是目前最火的語言之一了,人工智慧的興起讓python一夜之間變得家喻戶曉,python號稱目前最最簡單易學的語言,現在有不少高校開始將python作為大一新生的入門語言。本萌新也剛開始接觸python,發現python與其他語言確實有很大的區別。python是由c語言實現的,因此想...