-
Content Count
282 -
Joined
-
Last visited
-
Days Won
3
Posts posted by shineworld
-
-
15 hours ago, JGMS said:Hi SwiftExpat,
I created a folder with an embedded python 3.11 version in it, and installed all required libraries for my projects. Now my Delphi application(s) all have "PythonEngine1.DllPath" set to this "embedded folder".
I installed the libraries from within with the "Scripts" subfolder using commands like ".\pip install opencv-contrib-python --no-warn-script-location".
The command "python -m pip list -v" still returns the list of the libraries in the 3.10 system, though. Likely, that is due to the system's environment path setting, in where there is (and, I bet, should be) no entry added for the embedded version. I can live with that.
Next, I compressed everthing in a zip file "Python.zip", with the intention to unpack this as "3.11" aside the executable on other machines, using Inno Setup.
I can probably manage that, but after installation on the target machine the DLLPath should first be redirected to subfolder "3.11" in the path of the executable. On this one I am stuck.
Do you have tips to achieve this path change? Or do you have helpful comments on the approach I described?Take care:
You can have a Python embed version OUT of path which works but if you have the same version of Python installed normally
your embedded version pip list will reach ALSO a cached path (from the normally installed Python version) in %APPDATA%\Python\Python<version>\site-packages.
This does not overload your native Python embed local packages, just add others to pip visibility. -
Win11/Intel(R) Core(TM) i7-8565U CPU @ 1.80GHz Max 1.99 GHz (Max limited because a notebook)/4-cores/8-threads/16GB/RAD10.4/Release/<below data>
D:\spritz_bench>spritz_bench.exe spritz prng: 149.50 MiB/s D:\spritz_bench>spritz_bench.64.exe spritz prng: 191.12 MiB/s
-
1 hour ago, David Heffernan said:Potrebbe essere lanciato per lo sviluppo, ma il codice prodotto dai compilatori Delphi è lento
I wrote "it's fast" not "it's the fastest".
In some things it is the same as C++, in others, it is slightly slower but not as bad.
I work on very large projects, the last one being about 19 million lines of code, where there is a lot of math and UI.
I don't regret C++, I've tried translating parts from Delphi to Visual Studio C++ and then embedded as a DLL with no significant gains,
but resulting in longer development times and adding debugging difficulties.I use C and C++ a lot in the linux environment for embedded boards in ARM architecture, even if I have never seriously dealt with the freepascal counterpart, as in that environment you would navigate by sight.
-
you can't compare Python vs Delphi but think of Python with Delphi 🙂
-
Delphi is not DEAD is a very very OOP-powerful language.
It is fast.
It is simple and concise.
It is robust and safe.
It is productive (few lines of code compared to C++, Java, etc).
If completely customizable, you can modify any unit of any library (with sources) to do customized things.
Projects code has high longevity (I've moved old projects of 2007 to the latest versions with very few changes).
Support many platforms (I will hope in the future full direct support of Linux also for arm processors).
Long life to the Delphi! -
For me the better solution is
1. To use Python on Delphi, to access the immense packages library of Python overall in math things.2. Use Delphi to create new very fast modules, and packages, for Python, for example to move threaded things on Delphi where Python thread are very funny.
3. Use Delphi VCL/FMX to create robust Python UI and programs.
Delphi compiled code is one of more fast in the market.
Python covers a lot of scientific fields.
Use either and you will be a winner.
-
3 minutes ago, David Heffernan said:Considera un grande dizionario con, per amor di discussione, 1 milione di voci al suo interno. Supponiamo che in Python tu voglia scrivere
valore = foo[nome]
Ora, se foo fosse effettivamente nel tuo codice Delphi e supportato da un dizionario Delphi, vuoi davvero popolare un nuovo dict Python con 1 milione di elementi, quindi esegui la ricerca in Python e poi butta via quel dizionario. Non sarebbe meglio chiedere a Delphi di eseguire la ricerca. Questo è ciò che intendo di ciò che parlo del protocollo di mappatura.
Ma è del tutto possibile che io abbia frainteso ciò che realmente vuoi fare!
Ah ok, I completely misrepresented your previous sugestions.
So it would make more sense to do a normal GetPath(name) method that returns the value instead of returning a dictionary with all the variables 🙂
It makes sense
Thanks for the suggestion -
In other projects, I've used the automatic conversion of Delphi classes to related Python wrapper classes.
In this project, I would like manually create the python module classes using low-level python implementation.
Looking at P4D WrapFireDac.pas code I saw a way to manually create a dictionary.
Seems to work but is hard to know when to apply Py_XDecRef....function TPyCNCCore.GetPaths(AContext: Pointer): PPyObject; var Key: PPyObject; Value: PPyObject; PathsDict: PPyObject; Engine: TPythonEngine; procedure AddItem(const K, V: string); begin Key := Engine.VariantAsPyObject(Variant(K)); Value := Engine.VariantAsPyObject(Variant(V)); Engine.PyDict_SetItem(PathsDict, Key, Value); Engine.Py_XDecRef(Key); Engine.Py_XDecRef(Value); end; begin Adjust(@Self); Engine := GetPythonEngine; PathsDict := Engine.PyDict_New; AddItem('MachineBackupPath', Self.FCNCManager.MachineBackupPath); AddItem('MachineCustomizePath', Self.FCNCManager.MachineCustomizePath); AddItem('MachineMacrosPath', Self.FCNCManager.MachineMacrosPath); AddItem('MachineMediaPath', Self.FCNCManager.MachineMediaPath); AddItem('MachinePath', Self.FCNCManager.MachinePath); AddItem('MachineRunPath', Self.FCNCManager.MachineRunPath); AddItem('MachineVmPath', Self.FCNCManager.MachineVmPath); AddItem('SamplesPath', Self.FCNCManager.SamplesPath); AddItem('UserDataPath', Self.FCNCManager.UserDataPath); Result := PathsDict; end;
I don't know if this is the right way to 'return' a dict in a getter method..
In my ignorance of the subject, I am navigating by sight.
Should be cool a direct way to convert a TDictionary to Python dict. -
Hi all,
I would like to add, to a python4delphi module, a getter method which return a 'dict'.
For example:
> import pycnccore1 as pyc
>cnc_core = pyc.CNCCore()
>print(cnc_core.paths)
{'user_path': 'c:\\xyz', 'machine_path': 'd:\\machine_test', and so on}
I don't know how to create a Delphi type to contain the dictionary and convert it to a Python dict as a result of the getter method.
function TPyCNCCore.GetPaths(AContext: Pointer): PPyObject; begin Adjust(@Self); var PathDict: <i_do_not_know>; PathDict.Append('user_path', Self.UserPathString); PathDict.Append('machine_path', Self.MachinePathString); ... and so on ... Result := GetPythonEngine.VariantAsPyObject(PathDict); end; class procedure TPyCNCCore.RegisterGetSets(PythonType: TPythonType); begin inherited; with PythonType do begin PythonType.AddGetSet('paths', @TPyCNCCore.GetPaths, nil, 'Returns the used paths', nil); end; end;
Thanks in advance for your suggestions
Silverio -
Check also https://www.tmssoftware.com/site/blog.asp?post=1091
or import Adobe Reader ActiveX:
Just 1 minutes to integrate Reader in an empty delphi application
-
To propagate open-source state, on an inherited library, project must be under LGPL.
-
34 minutes ago, Fr0sT.Brutal said:You're able to modify clients? If yes, use TLS and check certificates of both server (at client side) and client (at server side), ensure certificate corresponds to server host and, for the maximum security, add auth by login-password
I will try to learn how to add TLS in TIdTCPServer and TIdTCPClient 🙂
- 1
-
1 hour ago, mjustin said:To clarify: you are looking for protection against malicious clients, and the server is not a concern?
The API Server (based on TCP/IP JSON requests) permits commands as {"cmd":"start.axis.movement"} so a TCP/IP client can connect to API Server,
ask for an axis motor to start. At moment any TCP/IP client, eg: Telnet, can ask for an API Server connection and is not safe for machine operator.
I would like to permit connection ONLY on trusted client applications (I my case a python program or a Delphi program which run in office).
And I would like that client/api messages are crypted during transport so none can intercept and learn what commands are used.
I can crypt/decript JSON messages to obfuscate them using for eg: bluefish or similar but I can't avoid a not trusted/client connection. -
Hi all,
First of all, I apologise if what is required is poorly described, but unfortunately I know very little about networks and their knowledge.
But let's get down to facts.
In an industrial machine control application, I have inserted a server, a TCP/IP server based on JSON messages, which allows the connectionof several clients at the same time and enables motor movement commands to be executed or information to be retrieved from the system.
A client programme connects to the server and from then on can do anything with the device it has connected to.
At this point, security problems arise, especially for the operator standing at the machine, since a malicious client intruding into the networkcould trigger dangerous operations for the operator standing near the machine and unaware that someone unauthorised has taken control of it remotely.
Now I have been asked to add a security layer, but as a complete ignoramus on the subject, I deal mainly with compilers of languages and UI environmentsand not with networks, I was wondering how to add a system of certification and authorisation of the client to the server connection.
For the client I use python while the server is done with Indy 10 using TIdTCPServer.
Thank you in advance for any suggestions and help.
Best regards
Silverio -
Sorry all, found it... is in TStyleBook component properties...
-
Hi all.
Usually I use FMX styles as they are for Firemonkey applications.
I need to check a style contents with the designer (I do that with VCL styles), but I'm notable to find FMX Style Designer in Tools menu.
Searching with Google seems that FMX Style Designer is available since XE but I cannot find it.
Have you any idea about ?
-
The readme is in Italian language but can be simply tranlsated with google:
After pip installation with > python get-pip.py it is necessary to rename python<version>._pth to python<version>._pth-disabled or delete it
so you can install packages with pip. -
The embedded python is not in the Windows path so he can't reach the %USERDATA%\Programs\Python\<embedded_python_path>\Scripts\pip.
You can also remove pip during installation when finisched to install all the offline packages 🙂
-
These are 3 scripts (windows) that I use to:
1] create requirements.txt file of pip installed packages2] download whl packages from requirements.txt
3] install the whl packages (offline)
A resulting requirements.txt looks like:
cffi==1.15.1 cnc-api-client-core==1.3.1 contourpy==1.0.6 cryptography==38.0.4 cycler==0.11.0 delphifmx==0.1.51 delphivcl==0.1.40 fonttools==4.38.0 kiwisolver==1.4.4 lxml==4.9.2 matplotlib==3.6.2 numpy==1.23.4 opcua==0.98.13 opencv-contrib-python==4.6.0.66 packaging==21.3 pbr==5.11.0 Pillow==9.3.0 pip==22.3.1 pybind11==2.10.1 pycparser==2.21 pyparsing==3.0.9 PySide6==6.4.0.1 PySide6-Addons==6.4.0.1 PySide6-Essentials==6.4.0.1 PySimpleGUI==4.60.4 python-dateutil==2.8.2 pytz==2022.7 scipy==1.9.3 screeninfo==0.8.1 setuptools==65.5.1 shiboken6==6.4.0.1 six==1.16.0 skia-python==87.5 tendo==0.3.0 wheel==0.38.3
Inno Setup script install Python embd and packages in this way;
[Run] Filename: {userpf}\{#MyAppName}.python\python.64.exe; Parameters: "-y"; WorkingDir: {userpf}\{#MyAppName}.python; StatusMsg: Unpack Python files...; Flags: runhidden Filename: {userpf}\{#MyAppName}.python\python.exe; Parameters: "-m pip install --no-index --find-links offline-packages --force-reinstall --requirement requirements.txt"; WorkingDir: {userpf}\{#MyAppName}.python; StatusMsg: Install Python Offline Packages...; Flags: runhidden #endif
-
That's what I do:
1) download python embd version.
2) added pip
3) make a backup of this point
4) used pio to install any package
5) used pip to create a requirement.txt of installed packages with version
6) used wheel to download whl of packages from requirements.txt
7) zipped python embd of point 3
8) used innosetup to install my exe + python embed + whl packages
9) during install placed exe in programs,l paced and extracted python in USERAPPDATA and then with script installed offline pip and whl packages.
In this mode it's simple to upgrade packages with more fresh without touch python things and end user can install python and packages without a internet connection.
-
I don't know if can be valid for you, but
in my Python programs I use Cython to transform the scripts (*.py files) into C code then compiled nativelyand transformed into pyd or .so so as to reduce the possibility of editing them.
Just keep a single "main_dummy.py" that instantiates a class in a "main.pyd" which is followed by all cythonized scripts.
-
Is Windows UI API SDK (WIN32) thread safe, eg EDIT, COMBOBOX, etc ?
I missed that... Sorry
-
6 minutes ago, programmerdelphi2k said:I know about loop, I came form "Clipper summer87"
I began with pure C + Win32 SDK + Petzold book (https://www.charlespetzold.com/pw5/index.html) but 1st edition 🙂
when you have to manage manually the events loop... -
TO BE very SIMPLE, TApplication, with Application instance, is or at least should be a Singleton, because manages the main events loop from Windows.
You can't have more than ONE...
It's the Windows structure of any application.
When you run a program Windows create a process with a main thread which call the delphi main code.
This main code create Application object which manage the messages loop (Windows is a messages-based OS) and on this
messages loop manager is implemented all VCL framework, etc...
Contributing to projects on GitHub with Subversion
in Tips / Blogs / Tutorials / Videos
Posted
In the company, when we switched from SVN to GIT, it was hard, initially just using console commands.
Then we started using TortoiseGIT and a way opened up.
Everything runs smoothly.
Collaborative work got easier, like tracking changes, versions, etc.
At this point, I honestly don't regret SVN at all...