첫 번 째 Python Extension [delphi]
4681 단어 python
다음 의 예 는 다음 코드 를 복사 하여 Exad. dpr 에 저장 하고 Delphi 로 직접 컴 파일 하면 Python Extension 이 될 수 있 습 니 다.우 리 는 먼저 효 과 를 본 후에 프로그램 을 분석 할 수 있다.
가장 작은 예:
{ ExAdd.dpr}
library ExAdd;
uses SysUtils,Classes,PythonEngine;
{$E pyd}
var
FModule : TPythonModule;
FEngine:TPythonEngine ;
function Add( Self, Args : PPyObject ) : PPyObject; far; cdecl;
var
a, b : Integer;
begin
with GetPythonEngine do
begin
if PyArg_ParseTuple( args, 'ii:Add', [@a, @b] ) <> 0 then
begin
Result := PyInt_FromLong( a + b );
end
else
Result := nil;
end;
end;
procedure initExAdd; cdecl;
begin
FEngine := TPythonEngine.Create(nil);
FModule := TPythonModule.Create(nil);
FModule.Engine := FEngine;
FModule.ModuleName := 'ExAdd';
FModule.AddMethod( 'exadd', @Add, 'exadd(a,b) -> a+b ' );
FEngine.LoadDll;
end;
exports
initExAdd;
var
OldExitProc: pointer;
procedure MyExitProc;
begin
FModule.Free;
FEngine.Free;
ExitProc := OldExitProc;
end;
begin
OldExitProc := ExitProc;
ExitProc := @MyExitProc;
end.
//
//from ExAdd import *
//print exadd(1,10)
이것 은 하나의 파일 Exadd. dpr 만 있 으 면 다른 Pas Unit 파일 이 필요 하지 않 은 가장 작은 예 입 니 다.우리 가 그 를 py 의 syspath 에 넣 었 을 때, 예 를 들 어 < python home > libsite - packages 는 pywin 에서 다음 과 같은 테스트 를 할 수 있 습 니 다.
>>> from ExAdd import *
>>> print exadd(1,10)
11
>>>
Python 내 프로그램 이 Delphi 를 통 해 작 성 된 확장 자 를 성공 적 으로 호출 한 것 을 볼 수 있 습 니 다.어떻게 했 어 요?
Python 에서 실행
from ExAdd import *
syspath 에서 Exadd. pyd 를 찾 습 니 다. 여기 pyd 는 일반적인 dll 입 니 다. 약속 이 있 을 뿐 입 니 다.Py 가 이 파일 을 찾 으 면 끌 어 내 는 함수 initExAdd 를 호출 합 니 다. 이 함수 의 이름 은 python 프로그램 과. pyd 모듈 의 약속 입 니 다. - 함수 이름 은 init + module 이름 이 어야 합 니 다.일반적으로 init 함수 에 서 는 엔진 초기 화, 모듈 등록, 함수, 유형의 등록 등 을 진행 합 니 다.이 예 에서 우 리 는 TPythonEngine, TPythonModule 두 P4D 가 제공 하 는 종 류 를 사용 하여 우리 가 이런 일 을 하 는 것 을 도 왔 다.모듈 등록 시 주의
FModule.ModuleName := 'ExAdd';
내 모듈 Name 은 Python 에서 사용 하 는 모듈 이 완전히 일치 합 니 다. 물론 우 리 는 ExQuickAdd 와 같은 다른 이름 을 사용 할 수 있 습 니 다.
from ExAdd import *
내 에서 사용 하 는 모듈 이름 이 일치 하면 됩 니 다.편리 함 과 일 치 를 위해 서, 우 리 는 dll 의 이름, python 내의 module, delphi 내의 TPythonModule 의 이름 이 완전히 일치 하 는 것 을 약속 할 수 있 습 니 다.이것 은 문법 적 으로 반드시 필요 한 것 은 아니 지만, 이렇게 하 는 것 은 좋 은 습관 이다.
다음 원형 에 따라 등 록 된 모든 함 수 는 PyExtension 의 함수 로 등 록 될 수 있 습 니 다.
function Add( Self, Args : PPyObject ) : PPyObject; far; cdecl;
그 중에서 cdecl 은 Pascal 이나 다른 것 이 아니 라 C 언어의 호출 규범 에 따른다 는 것 을 설명 한다.파 이 썬 은 C 언어 로 작 성 된 것 이기 때문에 당연히 C 언어의 습관 에 따른다.이 함수 원형 에서 매개 변 수 는 Self, Args 를 포함 하고 반환 가치 도 PPyObject 입 니 다. Python 언어 를 잘 아 는 사람 은 누구나 알 고 있 습 니 다. 모든 Python 함수 가 호출 될 때 Self 지침 을 전달 하고 Tuple 방식 으로 매개 변수 목록 을 전달 합 니 다. 이 Add 함수 의 실현 약속 에 있어 모든 유형 이 대상 입 니 다.예 를 들 어 Add (3, 4) 라 는 Python 호출 은 Add 가 Delphi 에서 함수 원형 을 참조 하면 '3, 4' 는 Tuple 대상 으로서 Self 와 수반 되 고 PPy Object 이 며 반환 값 7 도 PPy Object 로 표현 된다.아니면 파 이 썬 이 느리다 고 해 야 되 나?원래 하나의 추가 작업 은 어 셈 블 리 중의 명령 에 직접 대응 할 수 있 었 는데, 지금 은 대상 이자 지침 이 므 로 당연히 빠 르 기 어렵다.
일단 이런 성명 이 있 으 면 이렇게 함 수 를 등록 할 수 있다.
FModule.AddMethod( 'exadd', @Add, 'add(a,b) -> a+b ' );
이상 의 문 구 는 Python 시스템 에 설명 하고 exad 함수 의 실현 은 add 내 에 있 으 며 마지막 매개 변 수 는docstring__。IDE 에서 이 함 수 를 사용 할 때 codeinsight 나 help 를 통 해 함수 사용 설명 을 얻 을 수 있 습 니 다.이제 add 의 실현 코드 를 보 겠 습 니 다.한눈 에 보 니 PyArgParseTuple,PyInt_FromLong 은 두 가지 특별한 물건 이다.PyArg_ParseTuple 은 들 어 오 는 args 를 간단 한 Delphi 형식 으로 바 꾸 고 Ppyobject 에 저 장 된 3, 4 를 각각 a, b: Integer 에 저장 합 니 다.
PyArg_ParseTuple( args, 'ii:Add', [@a, @b] ) <> 0
그 중에서 두 번 째 매개 변수 인 'ii: add' 는 Format 형식 과 같 습 니 다. i 는 Integer 형식 을 가리 키 고 두 개의 I 는 두 개의 정수 가 있 습 니 다. add 는 선택 할 수 있 습 니 다. 오류 가 발생 했 을 때: add 가 있 습 니 다. 프로그래머 가 오 류 를 잘 찾 도록 도와 줄 수 있 습 니 다.이렇게 하면 PPyobeject 가 표현 하 는 Python Type 을 일반 Delphi 형식 으로 바 꿉 니 다.그리고 PyIntFromLong 은 Delphi 의 Long 유형 을 PyObject 의 Integer 로 바 꾸 는 것 을 생각 합 니 다.결 과 를 Python 으로 식별 할 수 있 습 니 다.이 두 함 수 는 P4d 로 이 루어 졌 지만 Python / C interface 매 뉴 얼 에 규정된 함수 이름과 일치 하기 때문에 구체 적 인 호출 방법 도 Python / C interface 매 뉴 얼 을 볼 수 있 습 니 다.
실제로 Python 실현 내의 대상 표현 은 하나의 구조 (Struct) 를 채택 하여 매우 복잡 하 다. 우 리 는 지금 매우 높 은 층 에서 볼 수 있 고 P4D 가 하 는 일 에 감사 해 야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.