-
Content Count
780 -
Joined
-
Last visited
-
Days Won
42
Posts posted by pyscripter
-
-
@dnbif72 Support for the buffer protocol was added to P4D.
A new demo (Demo35) shows how to access (read and write) numpy arrays super fast using the buffer protocol.
-
19 minutes ago, Uwe Raabe said:Seems not to be a valid solution to avoid the leak.
You are right. I have removed the code from the post, so as not to confuse people. The code at the first post works well.
-
3 hours ago, pyscripter said:Any idea why the compiler does not free TerminateProc on its own? Is this a compiler bug?
Answer myself. I remember having seen these some time ago, when I have been bitten by this again:
delphi - Memory leaks happens in nested anonymous method - Stack Overflow
TURBU Tech » Blog Archive » How to leak a class you never defined (turbu-rpg.com) (see Barry Kelly's comment).
- 1
-
This is a simplified version of what I had in my app.
procedure Test(); var TerminateProc: TThreadProcedure; S: string; begin S := 'Terminated'; TerminateProc := procedure begin ShowMessage(S); end; TThread.CreateAnonymousThread( procedure begin // Do stuff TThread.Queue(nil, TerminateProc); TerminateProc := nil; // Memory leak without this end).Start; end;
I had to insert the statement with the comment "Memory leak without this" to avoid memory leaks. Any idea why the compiler does not free TerminateProc on its own? Is this a compiler bug?
-
1 hour ago, mbaghb said:ow to import its once when initalizing pythonengin and pythonmodule. that is very important for increase performance to get function result.
Importing a module for second, third.. time has no significant performance cost.
- 1
-
-
51 minutes ago, dnbif72 said:Well somewhere along the line I must of thought I was getting an address to the pointer to the memory block that held the data, and that it would magically cast to what I wanted! I can see now, that should be a Py_buffer object, which does have the void* buffer at the beginning of the structure so that's why I was seeing and able to copy the data, but I guess it (and or the associated PyObject) needs to be released. I can copy the structure and likely get that to work, but I would still need to replicate the Py_Buffer_Release() routine. Unless your seeing something else I am missing here?
Your code leads to memory corruption. PyArg_ParseTuple(args,"y*",&data); will copy the Py_Buffer structure to the address of data overwriting whatever was after that.
If you wait for a few days, I will add the Py_Buffer stuff to P4D and provide an example of getting raw access to nympy.ndarray data.
Looking forward to receiving C++ Builder installation instructions!
-
@dnbif72By the way, since I am not using C++ Builder, I am looking for someone to provide detailed instructions for installing P4D in C++ Builder. The instructions provide David Intersimone are outdated. See for example: No Python_D.dproj project file inside python4delphi-master\Packages\Delphi\Delphi 10.4+. · Issue #416 · pyscripter/python4delphi (github.com)
Could you please help?
-
8 hours ago, dnbif72 said:double * data;
int ret = eng->PyArg_ParseTuple(args,"y*",&data);
What do you expect to be passed to data?
Please see the docs: Parsing arguments and building values — Python 3.12.0 documentation
"y*" is one of the most esoteric formats. This is the correct way of using it by Victor Stinner one of the python gurus (from this web page).
static PyObject * getargs_y_star(PyObject *self, PyObject *args) { Py_buffer buffer; PyObject *bytes; if (!PyArg_ParseTuple(args, "y*", &buffer)) return NULL; bytes = PyBytes_FromStringAndSize(buffer.buf, buffer.len); PyBuffer_Release(&buffer); return bytes; }
Note that the Py_buffer structure and related functions are not yet defined in P4D, so you will have to get it from the python headers.
-
20 minutes ago, JonRobertson said:I just installed Phython4Delphi.
Did you install the master branch from pyscripter/python4delphi: Free components that wrap up Python into Delphi and Lazarus (FPC) (github.com)?
Here Demo01 and other demos run fine.
-
You may want to give pyscripter/Ssh-Pascal: Delphi ssh library wrapping libssh2 (github.com) a try. It is a wrapper around libssh2, includes scp, sftp, ssh support. Very fast.
- 2
-
Use
TThread.ForceQueue
from inside the OnShow handler.
TThread.ForceQueue accepts an optional delay.
- 1
-
Never mind. I forgot the answer to an older question.
No rtti is generated for class fields and properties, which is a shame. It does for class methods though.
-
TTest = class A: string; class var B: string; end;
Is it possible to tell that B is a class field using Rtti? Ditto for properties.
And if you get a chance have a look at my other Rtti question.
-
12 minutes ago, Attila Kovacs said:The overloaded methods will be listed one by one
But so do overwritten methods, virtual methods etc.
-
As per title.
For instance:
A) Second method hides the first
ClassA = class procedure Test(I: Integer); end; ClassB = class(classA) procedure Test(S: string); end;
B) Second method overloads the first
ClassA = class procedure Test(I: Integer); overload; end; ClassB = class(classA) procedure Test(S: string); overload; end;
How can you tell the difference with Rtti. GetMethods would show both methods in a similar way.
-
This was a python reference counting issue.
Fixed in version control.
Please try the latest version and confirm the issue is solved.
-
Are you following the instructions at Installation · pyscripter/python4delphi Wiki (github.com)?
Specifically, did you build all packages before installing them?
-
Clear the output?
-
This project deserves some attention (greenlets-coroutines, generators, channels and more). It is based on fibers.
- 2
-
1 hour ago, Dmitry72 said:pythonXXX.dll is a single process library
You cannot load multiple versions of any dll simultaneously in a single process.
1 hour ago, Dmitry72 said:But those threads are inside of Python session and share the same environment.
If you study Demo 33, you will see that this is not necessarily the case.
-
2 hours ago, Dmitry72 said:So, the pythonXXX.dll is a single threaded library.
Why do you conclude that? If you want to run python code in threads, please study Demo 33 and search for related content in this forum (there is lots). Also google for "Global Interpreter Lock".
-
Running python in threads is not straightforward. Have a look at TPythonThread, Demo 33, and search this forum for relevant discussions.
-
4 hours ago, JGMS said:The only effect was that a black command screen appeared for about half a second
Then try the following before loading the engine:
- Create a TPythonInputOutput
- Set the PythonEngine IO property to the TPythonInputOutput
- Set the RedirectIO property to True.
True thread parallelism with P4D and Python 12
in Python4Delphi
Posted · Edited by pyscripter
In case you have not heard, Python 12 made a breakthrough towards running threads in parallel. For now, the feature is only available through the C-API and there are limitations. But still, the performance boost that comes from the exploitation of multiple cores makes this feature very desirable. P4D makes this feature very easily accessible by adding a new execution mode to TPythonThread. There is also a new demo (Demo 36) that shows how to run threads in parallel. If you are wondering about the performance boost, see the results below:
You can find more details in this P4D announcement.