Salut Yannick, Bravo pour toutes ces idées très constructives.
Je viens d'installer ton module "tools.py", voici ce qu'il me donne, après l'ouverture d'un nouveau fichier. Je pense que c'est logique, la fonction CreatePythonTools ne nécessite aucun paramètre, alors que tu l'appelles avec un argument dans la fonction événementielle onPageOpened. Début du message d'erreur Traceback (most recent call last): File "plugins/tools.py", line 235, in onPageOpened CreatePythonTools(newPage) TypeError: CreatePythonTools() takes 0 positional arguments but 1 was given Fin du message d'erreur Sinon, pour tes autres idées, le forPython est à toi, tu peux y ajouter tout ce que tu veux. C'est grâce à toi d'ailleurs que cette nouvelle fonctionnalité de recherche des versions de Python figurant sur le PC a été ajoutée. Pour le PB que tu soulèves avec l'expression régulière, dans ton autre post, je pense qu'il faut ajouter l'option re.MULTILINE dans ton second argument, afin que le multiligne soit bien prise en compte lors du match. Tu peux d'ailleurs cumuler cette option avec l'option re.IGNORECASE, en les séparant par une barre verticale. Voilà, merci à toi. Bien amicalement, Abdel. ----- Original Message ----- From: Yannick Youalé To: [email protected] Sent: Tuesday, February 16, 2016 9:50 AM Subject: [progliste] Re: 6pad++- amélioration au forPython- exécution de fichier et prise en compte de multiples versions de python Coucou Abdel, Débu de citation Pour ma part, j'ai aussi fait avancer un peu le travail, l'extension forPython comporte désormais le nécessaire pour rechercher les versions de Python sur le disque dur, et les afficher dans une liste de sous-menus figurant dans un sous-menu du menu forPython, intitulé "Activer une version de Python installée". Fin de citation Je l'ai testé sur un de mes ordi (avec windows 7), et malheureusement, dans le menu, il n'y a que 6pad++ qui apparaît. Mon python27 qui pourtant est directement dans le disque C est ignoré. Tandis que sur un autre avec windows XP tout apparaît bien (python25 et python27). Quel est ce mystère ? Et j'avais une préoccupation quant au choix d'enregistrer les chemins vers les exécutables de python trouvés dans un objet dictionnaire. Les éléments dans le dictionnaire se retrouvent par une clée, qui est sensée être unique. Or dans ton code, la clée est le nom du dossier principale de la version de python. Ce qui risque de poser problème dans les cas où quelqu'un aurait décidé d'avoir plusieurs fois la même version de python sur son ordinateur. Par exemple une version portable et une version installée. Un cas qui est certes rare, mais n'en reste pas moins possible. A oui, j'ai vu que tu as inclu un dossier que je n'avais pas compté: le x:/Program Files (x86 Dans mon code, toujours concernant le repérage des pythons installés, tu veras que je te propose une manière plus efficace de parcourir les dossier. il s'agit de faire une itération sur les lettres alphabétiques. Exemple: alphabet="ABCDEFGHIJKL" for e in alphabet: # test d'existence Pour ce qui est de l'exécution du module courant, nous avons fait presque parreil. Cependant, une petite subtilité: moi j'ai préféré envoyé les messages d'erreur ou tout ce qui devrait s'afficher en console dans la console de 6pad++. Et pour améliorer encore cela, je prévoit en plus parser les messages d'erreur pour pouvoir repérer le fichier et le numéro de ligne comportant l'erreur, afin de s'y positionner dans l'onglet courant ou dans un nouvel onglet s'il s'avère qu'il ne s'agit pas du document courant. Le fichier logFile est important pour retracer les erreurs, mais ne devrait pas être ouvert dans un nouvel onglet si les erreurs sont sensées apparaître dans la console de 6pad++ à mon humble avis. Début de citation pourquoi ne pas enrichir l'extension pour pouvoir compiler du code et générer un exécutable, du style setup.py py2exe, en supposant bien sûr que Py2exe ou un autre module servant à faire cela sera installé dans notre version de Python? Fin de citation Hé bien mon petit Abdel, figures-toi que j'y pensais déja. Concernant le py2exe, j'ai gardé des notes qui sont sensés m'aider à le faire. Je vous les collerai plus bas. En fait, j'entrevoyais un élément de menu labélisé "Créer un exécutable" qui déclencherait une fonction qui, suivant la présence du py2exe ou du pypi ou même un autre créateur d'exécutable chez la version de python cochée lancerait la génération. Et dans le cas où plusieurs seraient repérés, pourquoi ne pas proposer le choix de l'un d'entre eux dans une liste ? Comme autres améliorations possibles, hormis celles que j'ai déjà cité plus haut, il y a: * la définition du mot clé sous le curseur et l'affichage dans la console de 6pad++ je travaille dessus. Quelques soucis avec les expressions régulières qui sont ma foi assez différentes de celles que j'ai connu dans le vb6. * une véritable intellicence. C'est-à-dire par exemple taper un point, et faire ctrl+j ou ctrl+espace pour que la liste des objets et méthodes de l'objet devant lequel on a mis le point soient proposés dans une liste. Evitera de faire des aller et retour entre l'IDE et la documentation. * la vérification des lignes juste après leur modification et tentative de déplacement à une autre ligne. Il s'agit de vérifier quelques éléments de syntaxe et d'avertir directement en cas d'erreur supposé. Seront vérifiés par exemple: - l'équilibre des accolades, guillemets, appostrophes, parenthèses - la présence des deux points à la fin des lignes qui le nécessitent - la nécessité de ne pas mélanger de type d'indentation au début de la ligne On peut également se servir du même évènement pour s'assurer du respect de la cass pour certains mots clé, variables et nom de fonction. Par exemple les True et False qui doivent avoir la majuscule en premier caractère. Ca peut d'ailleurs se corriger sans que l'utilisateur ne s'en rende compte. * l'insertion automatique de fonctions (constructeur, destructeur, ou autres), de classes (héritées ou non) Cela tout en vérifiant l'emplacement et les niveaux d'indentation. * l'insertion d'imports (modules et classes, etc... * la création dans le menu d'aide d'un item qui ouvrira le fichier chm de la version du python actuellement sélectionnée. * la prise en compte de projets de développement et d'options de sauvegarde. Bon je m'arrête là. Néanmoins c'est déjà assez conséquent comme vous le conviendrez avec moi n'est-ce pas ? Certains sont-ils chaud pour qu'on se partage le boulot ? Maintenant les notes sur comment créer un exécutable en ligne de commande avec le py2exe Début des notes __h2 Créer un programme exécutable avec Py2exe L'extension Py2exe permet de convertir un script Python en un programme exécutable (uniquement pour le système d'exploitation Windows). Ce programme exécutable (fichier avec l'extension .exe) peut ensuite être lancé sur un ordinateur où Python n'est pas installé. __h3 Téléchargement et installation de Py2exe Il faut un ordinateur avec Windows et Python déjà installé (attention : Py2exe ne supporte pas la version 3 de Python). Le programme d'installation de Py2exe est disponible ici : __Link sourceforge.net/projects/py2exe/files/py2exe/0.6.9/ Avec une machine 32 bits et Python version 2.7, vous devez utiliser le fichier suivant : __Link py2exe-0.6.9.win32-py2.7.exe Une fois téléchargé, il suffit d'exécuter ce fichier pour installer Py2exe. __h3 Utilisation de Py2exe A titre d'exemple, voici le script d'un jeu de puissance 4 : __Link jeu_puissance4.py Télécharger et enregistrer ce script dans le répertoire où est installé Python (chez moi, c'est le répertoire C:Python27). Créer le script setup.py : # setup.py from distutils.core import setup import py2exe setup(windows=["jeu_puissance4.py"]) Enregistrer le script setup.py dans le répertoire courant de Python. __h4 Remarques si vous voulez disposer de la console en plus de l'interface graphique (GUI), remplacer setup(windows=["jeu_puissance4.py"]) par setup(console=["jeu_puissance4.py"]) pour traiter plusieurs scripts en même temps, il suffit de compléter la liste :setup(windows=["jeu_puissance4.py","script2.py","script3.py"]) Ouvrir l'interpréteur de commande de Windows (Démarrer Exécuter cmd) Placez-vous dans le répertoire courant de Python (commande cd : change directory) : > cd C:Python27 puis lancer Py2exe : > python setup.py py2exe Un sous répertoire nommé dist est créé (chez moi C:Python27dist). Il contient le fichier exécutable jeu_puissance4.exe ainsi que toutes les ressources nécessaires à un fonctionnement autonome (python27.dll library.zip...). Vous pouvez maintenant copier le répertoire complet dist et le distribuer vers des ordinateurs qui ne possèdent pas Python. Le programme se lancera en exécutant le fichier jeu_puissance4.exe. Fin des notes Amicalement, Yannick Daniel Youalé La programmation est une religion. Aimez-la, ou quittez-la. www.visuweb.net ----- Original Message ----- From: _Abdel_ To: [email protected] Sent: Monday, February 15, 2016 7:03 PM Subject: [progliste] Re: 6pad++- amélioration au forPython- exécution de fichier et prise en compte de multiples versions de python Salut Yannick et la ML ! Alors, c'est la forme? Tout d'abord, je tenais à te féliciter Yannick pour ce super travail, tu as bien fait avancer le schmilblick lol ! Pour ma part, j'ai aussi fait avancer un peu le travail, l'extension forPython comporte désormais le nécessaire pour rechercher les versions de Python sur le disque dur, et les afficher dans une liste de sous-menus figurant dans un sous-menu du menu forPython, intitulé "Activer une version de Python installée". Le sous-menu forPython comporte aussi une commande exécuter, activable grâce au raccourci clavier CTRL + F5, qui exécutera, selon la version de Python choisie dans le menu, la version de Python qui sera cochée et l'associera au module en cours d'implémentation. Si on veut utiliser le Python embarqué avec 6pad++, il faudra cocher le premier élément du sous-menu "Activer une version de Python installée", qui est coché par défaut. Il conviendra alors de sélectionner dans le module en cours d'exploration, la partie du code que l'on souhaite voir s'exécuter, avant de lancer le raccourci CTRL + F5, la sortie sera dirigée vers la console. Si on coche une version installée sur le PC, la sélection du code à exécuter ne sera pas indispensable, ce sera tout le module en cours d'exploration ou d'implémentation qui sera exécuté, et la sortie redirigée vers un fichier logFile.log, qui sera ouvert automatiquement. Les autres améliorations sont les suivantes : Les regexps servant à atteindre les classes et fonctions ont été réunies dans un dictionnaire, qui pourra être enrichi par d'autres regexps, au cas où vous souhaiteriez exploiter d'autres langages de programmation, différents du Python. La fonction événementielle onKeyUp a été mise à jour comme cité dans mon précédent post. PS: Pour l'exécution d'un code Python avec le Python embarqué dans 6pad++, 2 pistes sont envisageables, elles sont très simples et ont bien été décrite par notre ami Cyrille, que je salue au passage : Première méthode : # Instruction servant à créer un objet qui pourra être exécuter avec exec. code=compile(sp.window.curPage.selectedText, sp.window.curPage.file, "exec") # Exécution de l'objet. exec(code) Seconde méthode, qui est encore plus simple et qui fonctionne tout aussi bien, elle consiste tout simplement à exécuter directement les lignes de code avec la fonction exec : exec(sp.window.curPage.selectedText) La sortie sera alors redirigée vers la console Python de 6pad++. Les fonctions compile et exec sont des fonctions appartenant au builtin de Python. Les perspectives à venir pour le forPython sont les suivantes : Puisque le module subprocess et ses méthodes Popen et call accepte des arguments dans le premier paramètre servant à définir la séquence de commandes à exécuter, pourquoi ne pas enrichir l'extension pour pouvoir compiler du code et générer un exécutable, du style setup.py py2exe, en supposant bien sûr que Py2exe ou un autre module servant à faire cela sera installé dans notre version de Python? Ce serait super lol ! N'hésitez surtout pas à nous dire ce que vous pensez du travail réalisé, est-ce qu'il y a quelque chose à retoucher, etc. Voilà, merci à vous. Bien amicalement, Abdel. ----- Original Message ----- From: Yannick Youalé To: [email protected] Sent: Monday, February 15, 2016 4:33 PM Subject: [progliste] 6pad++- amélioration au forPython- exécution de fichier et prise en compte de multiples versions de python Salut à tous, Je voudrais vous soumettre aujourd'hui le fruit d'une partie de mon travail de ces dernières semaines. Je l'ai regroupé dans un module temporaire nommé tools, et les prédestine a être intégrés au module forPython. Il s'agit principalement des fonctionnalités suivantes: * le listage comme éléments de sous-menu des versions de pythons repérés sur l'ordinateur courant; Ce qui donne la possibilité de cocher la version pour laquelle on décide de développer dans le 6pad++. Le choix est sauvegardé dans le fichier de configuration. * La création d'un menu "Exécuter CTRL+F5" qui lance l'exécution/la précompilation du module courant par la version du python qui a été préalablement sélectionnée dans les menus. * La création d'un menu "arrêter l'exécution" qui est sensé arrêter de force une exécution qui aurait été lancée par le menu précédent. La version du python choisie est conservée dans une variable globale curPythonPath qui est le chemin vers l'exécutable de ce python. Une liste globale nommée pythonList contient les références des autres pythons qui ont été détectés, et sont ordonnés selon leur position comme éléments du sous-menu "versions de python". Le 6pad++ est considéré comme un exécutable python puisqu'on peut faire des script pour lui. il apparaît d'ailleurs comme premier élément du sous-menu "Versions de python". Mais je dois avouer que je n'ai pas pu jusqu'ici trouver la bonne formulation de ligne de commande pour qu'il renvoi erreur ou succès à l'exécution par ctrl+f5. Peut-être allez-vous m'aider à faire la correction. En m'aidant de l'extension perso.py, de Cyrille, j'ai créé la fonction runCurPythonScript() qui est un exemple de communication par ligne de commande et output entre deux versions de pythons totalement différentes. J'espère que ça vous plaira. Alors, mon petit Abdel, qu'est-ce que tu en dis ? Quoi ? Ne me dis pas que j'arrives en retard et que tu as déja fait tout ça !!! MDR ! A plus ! Yannick Daniel Youalé La programmation est une religion. Aimez-la, ou quittez-la. www.visuweb.net
