@@ -344,6 +344,20 @@ TPythonVersionProp = record
344344 PyBUF_READ = $100 ;
345345 PyBUF_WRITE = $200 ;
346346
347+ const
348+ // constants used in PyModuleDef slots from moduleobject.h
349+ Py_mod_create = 1 ;
350+ Py_mod_exec = 2 ;
351+ Py_mod_multiple_interpreters = 3 ; // Added in version 3.12
352+ Py_mod_gil = 4 ; // Added in version 3.13
353+
354+ Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED: Pointer = Pointer(0 );
355+ Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED: Pointer = Pointer(1 );
356+ Py_MOD_PER_INTERPRETER_GIL_SUPPORTED: Pointer = Pointer(2 );
357+
358+ Py_MOD_GIL_USED: Pointer = Pointer(0 );
359+ Py_MOD_GIL_NOT_USED: Pointer = Pointer(1 );
360+
347361// #######################################################
348362// ## ##
349363// ## Non-Python specific constants ##
@@ -643,6 +657,10 @@ TPythonVersionProp = record
643657 m_free : inquiry;
644658 end ;
645659
660+ // signature of functions used in slots
661+ Py_create_module_function = function(spec: PPyObject; def: PPyModuleDef):PPyObject; cdecl;
662+ Py_exec_module_function = function(module : PPyObject): Integer; cdecl;
663+
646664 // pybuffer.h
647665
648666 PPy_buffer = ^Py_Buffer;
@@ -1541,6 +1559,9 @@ TPythonInterface=class(TDynamicDll)
15411559 PyCallable_Check: function(ob : PPyObject): integer; cdecl;
15421560
15431561 PyModule_Create2: function(moduledef: PPyModuleDef; Api_Version: Integer):PPyObject; cdecl;
1562+ PyModuleDef_Init: function(moduledef: PPyModuleDef):PPyObject; cdecl;
1563+ PyModule_ExecDef: function(module : PPyObject; moduledef: PPyModuleDef):Integer; cdecl;
1564+ PyModule_FromDefAndSpec2: function(moduledef: PPyModuleDef; spec: PPyObject; Api_Version: Integer):PPyObject; cdecl;
15441565 PyErr_BadArgument: function: integer; cdecl;
15451566 PyErr_BadInternalCall: procedure; cdecl;
15461567 PyErr_CheckSignals: function: integer; cdecl;
@@ -2173,7 +2194,7 @@ TPythonEngine = class(TPythonInterface)
21732194 property IO: TPythonInputOutput read FIO write SetIO;
21742195 property PyFlags: TPythonFlags read FPyFlags write SetPyFlags default DEFAULT_FLAGS;
21752196 property RedirectIO: Boolean read FRedirectIO write FRedirectIO default True;
2176- property UseWindowsConsole: Boolean read FUseWindowsConsole write FUseWindowsConsole default False;
2197+ property UseWindowsConsole: Boolean read FUseWindowsConsole write SetUseWindowsConsole default False;
21772198 property OnAfterInit: TNotifyEvent read FOnAfterInit write FOnAfterInit;
21782199 property OnSysPathInit: TSysPathInitEvent read FOnSysPathInit write FOnSysPathInit;
21792200 property OnConfigInit: TConfigInitEvent read FOnConfigInit write FOnConfigInit;
@@ -2534,12 +2555,6 @@ TPythonModule = class(TMethodsContainer)
25342555 end ;
25352556
25362557
2537- // -------------------------------------------------------
2538- // -- --
2539- // --class: TPythonType derived from TGetSetContainer --
2540- // -- --
2541- // -------------------------------------------------------
2542-
25432558{
25442559 A B C
25452560 +-------------------++------------------------------------------------------+
@@ -2556,15 +2571,15 @@ TPythonModule = class(TMethodsContainer)
25562571 by GetSelf
25572572
25582573 - a Python object must start at A.
2559- - a Delphi class class must start at B
2574+ - a Delphi class must start at B
25602575 - TPyObject.InstanceSize will return C-B
25612576 - Sizeof(TPyObject) will return C-B
25622577 - The total memory allocated for a TPyObject instance will be C-A,
25632578 even if its InstanceSize is C-B.
2564- - When turning a Python object pointer into a Delphi instance pointer, PythonToDelphi
2565- will offset the pointer from A to B.
2566- - When turning a Delphi instance into a Python object pointer, GetSelf will offset
2567- Self from B to A.
2579+ - When turning a Python object pointer into a Delphi instance pointer,
2580+ PythonToDelphi will offset the pointer from A to B.
2581+ - When turning a Delphi instance into a Python object pointer, GetSelf
2582+ will offset Self from B to A.
25682583 - Properties ob_refcnt and ob_type will call GetSelf to access their data.
25692584
25702585 Further Notes:
@@ -2581,7 +2596,6 @@ TPythonModule = class(TMethodsContainer)
25812596 FreeInstance.
25822597 - This class is heart of the P4D library. Pure magic!!
25832598}
2584- // The base class of all new Python types
25852599 TPyObject = class
25862600 private
25872601 function Get_ob_refcnt : NativeUInt;
@@ -2751,6 +2765,13 @@ TTypeServices = class(TPersistent)
27512765 property Mapping : TMappingServices read FMapping write FMapping;
27522766 end ;
27532767
2768+ // -------------------------------------------------------
2769+ // -- --
2770+ // --class: TPythonType derived from TGetSetContainer --
2771+ // -- --
2772+ // -------------------------------------------------------
2773+
2774+ // The base class of all new Python types
27542775 // The component that initializes the Python type and
27552776 // that creates instances of itself.
27562777 { $IF not Defined(FPC) and (CompilerVersion >= 23)}
@@ -3901,6 +3922,9 @@ procedure TPythonInterface.MapDll;
39013922 PyDict_SetItemString := Import (' PyDict_SetItemString' );
39023923 PyDictProxy_New := Import (' PyDictProxy_New' );
39033924 PyModule_Create2 := Import (' PyModule_Create2' );
3925+ PyModuleDef_Init := Import (' PyModuleDef_Init' );
3926+ PyModule_ExecDef := Import (' PyModule_ExecDef' );
3927+ PyModule_FromDefAndSpec2 := Import (' PyModule_FromDefAndSpec2' );
39043928 PyErr_Print := Import (' PyErr_Print' );
39053929 PyErr_SetNone := Import (' PyErr_SetNone' );
39063930 PyErr_SetObject := Import (' PyErr_SetObject' );
@@ -5072,6 +5096,19 @@ procedure TPythonEngine.Initialize;
50725096 if not Initialized then
50735097 Initialize;
50745098
5099+
5100+ { $IFDEF MSWINDOWS}
5101+ if not FRedirectIO and UseWindowsConsole then
5102+ PyRun_SimpleString(
5103+ ' import sys, io' #10 +
5104+ ' sys.stdout = io.TextIOWrapper(open("CONOUT$", "wb", buffering=0), ' +
5105+ ' encoding="utf-8", errors="replace", line_buffering=True)' #10 +
5106+ ' sys.stderr = io.TextIOWrapper(open("CONOUT$", "wb", buffering=0), ' +
5107+ ' encoding="utf-8", errors="replace", line_buffering=False)' #10 +
5108+ ' sys.stdin = io.TextIOWrapper(open("CONIN$", "rb", buffering=0), ' +
5109+ ' encoding="utf-8", errors="replace", line_buffering=True)' #10 );
5110+ { $ENDIF}
5111+
50755112 if InitScript.Count > 0 then
50765113 ExecStrings(InitScript);
50775114 if Assigned(FOnAfterInit) then
@@ -5127,10 +5164,12 @@ procedure TPythonEngine.InitWinConsole;
51275164 FreeConsole;
51285165 AllocConsole;
51295166 SetConsoleTitle( ' Python console' );
5167+ SetConsoleOutputCP(CP_UTF8);
5168+ SetConsoleCP(CP_UTF8);
51305169{ $ENDIF}
51315170end ;
51325171
5133- procedure TPythonEngine.SetUseWindowsConsole ( const Value : Boolean );
5172+ procedure TPythonEngine.SetUseWindowsConsole (const Value : Boolean);
51345173begin
51355174 FUseWindowsConsole := Value ;
51365175 if (csDesigning in ComponentState) then
0 commit comments