Bonjour,
J'essaye d'utiliser python4lazarus, démarrer chaque PythonEngine dans un Thread et exécutze dans chacun un script Python différent.
Puis-je avoir un exemple si c'est possible ?
Merci
Version imprimable
Bonjour,
J'essaye d'utiliser python4lazarus, démarrer chaque PythonEngine dans un Thread et exécutze dans chacun un script Python différent.
Puis-je avoir un exemple si c'est possible ?
Merci
hello,
peux-tu nous dire ce que tu veux faire exactement ? Lancer plusieurs scripts python en parallèle ? Autre chose ? As-tu déjà essayé quelque chose ? Montre-nous alors ton code.
As-tu ce problème ?
La personne qui maintient Python4Lazarus (Alextp) est souvent présent dans le forum anglais de Lazarus alors pose ta question dans ce forum ou relance la question ci-dessus dans ce forum.Citation:
Is it possible to run more than one PythonEngine from threads inside an app?
When I try that, it says "There is already one instance of TPythonEngine running". Maybe there is a workaround?
Ami calmant, J.P
Bonjour,
Je cherche à démarrer plusieurs scripts Python (qui bouclent à l'infini, où je devrais récupérer le résultat d'un traitement) et chacune dans un thread. J'ai déjà essayé avec une classe TThread et ça ne marche pas. J'ai même testé avec le initThread:=True du PythonEngine mais l'application reste quand même bloquée.
Code:
1
2
3
4 Procedure TMyThread.Execute; begin GetPythonEngine.ExecString(memo1.Text); end;
Code:
1
2 While True: print(generate())
hello,
cela n'a pas l'air facile de gérer les threads avec Python4Lazarus. Il y a bien la classe TPythonThread mais il n'y a pas d'exemple qui fonctionne dans les démos. Il y a bien la démo 11 dans la partie démo Delphi mais elle est compliquée et difficile à traduire en Lazarus. Et Il y a même je pense des erreurs de code dans la définition de TPythonThread dans PythonEngine.pas ( exemple : la propriété ThreadExecMode n'a pas de définition write).
Sinon il y a des explications pour l'utilisation de Thread dans Python4Delphi ici
Ami calmant, J.P
Salut,
un petit zip attaché ici avec ton application de test, nous permettrait de t'aider plus efficacement. Sinon il y a une autre solution lancer les scripts via la commande python avec un TProcess et récupérer le résultat.
Tu peux te référer à cette discussion pour plus d'infos.
A+
Jérôme
hello,
bon ben finalement j'ai réussi à utiliser TPythonThread.
1 - Il y a une erreur dans le fichier PythonEngine.pas du paquet Python4Lazarus :
il manque le write pour la propriété ThreadExecMode de la classe TPythonThread
près de la ligne 3127 remplacer :
parCode:property ThreadExecMode: TThreadExecMode read fThreadExecMode;
2 - J'ai créé un petit projet (en pièce jointe) qui permet de lancer ce script Python dans 3 threads en même temps :Code:
1
2property ThreadExecMode: TThreadExecMode read fThreadExecMode write fThreadExecMode;
Voici ce que cela donne après exécution :Code:
1
2
3
4
5
6
7
8
9
10
11
12 # coding: utf8 # script for testing PythonThread # Jurassic Pork october 2020 import time print('Coundown Thread1 :') time.sleep(1.0) i = 1 while i < 5: print('Thread1 : ',5 - i) i += 1 time.sleep(1.0) print('Thread1 terminated')
Pièce jointe 581431
Les print du python sont envoyés dans la console.
Le projet a été testé avec Lazarus 2.0.10 sous windows 10 et Lazarus 2.0.8 sous Centos 8.1.
En pièce jointe ma configuration du composant PythonEngine1 pour windows. Pour centos 8 :
Citation:
DllName : libpython3.6m.so
DllPath : /usr/lib64
RegVersion : 3.6
Ami calmant, J.P
Merci :)