PythonプログラムのByteArray変数を、Pythonで遅すぎる処理を高速化するためにC言語で書かれたDLLに渡したいとします。私はWebを通過し、Byref、キャスト、memoryviews、addressofの組み合わせでCtypesを試しましたが、何も動作しません。私のByteArrayを渡す何かにコピーせずにこれを達成する簡単な方法はありますか?ByteArrayをPythonからC関数に渡す
/* My C DLL */
__declspec(dllexport) bool FastProc(char *P, int L)
{
/* Do some complex processing on the char buffer */
;
return true;
}
# My Python program
from ctypes import *
def main(argv):
MyData = ByteArray([1,2,3,4,5,6])
dll = CDLL('CHELPER.dll')
dll.FastProc.argtypes = (c_char_p, c_int)
dll.FastProc.restype = c_bool
Result = dll.FastProc(MyData, len(MyData))
print(Result)
しかし、C関数に最初のパラメータ(のMyData)を通過するとき、私は型エラーを取得:ここに は、私がやろうとしていますものです。
C関数のメリットを浪費するオーバーヘッドをあまり必要としないソリューションはありますか?
オリヴィエ
は 'ByteArray'何ですか?それは 'bytearray'(小文字)であってはならないのですか?あなたはPython 3を使用していますか? –
はい、bytearray、ごめんなさい。 – Marmotte06
同じ長さのctypes配列型を作成し、その 'bytearray'を[' from_buffer'](https://docs.python.org/3/library/ctypes)に渡してください。 html#ctypes._CData.from_buffer)コンストラクタ、例えば'L = len(MyData);' 'P =(ctypes.c_char * L).from_buffer(MyData);' 'dll.FastProc(P、L)'です。 – eryksun