From 81d5d8c75be3cb556210650151ed8a7b950607d3 Mon Sep 17 00:00:00 2001 From: snoopy Date: Fri, 4 Sep 2026 07:01:00 +0200 Subject: [PATCH] Build: embarquer les executables auxiliaires de pywinpty MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PyInstaller ne suit que les bibliotheques liees : il embarquait winpty.dll et conpty.dll, mais ignorait les deux executables que pywinpty lance en sous-processus pour creer la pseudo-console. Resultat, l'application se lancait normalement mais tous les terminaux se fermaient instantanement ("Deconnecte (Terminal ferme)") — un defaut invisible en mode script, ou les fichiers sont presents dans l'environnement virtuel. - OpenConsole.exe : hote du backend ConPTY (celui utilise par defaut) - winpty-agent.exe : requis par le repli WinPTY Ils sont localises dans le paquet installe au moment du build, donc la recette reste valable sur n'importe quel poste. Verifie sur l'executable produit : OpenConsole.exe et powershell.exe apparaissent bien comme processus enfants. Co-Authored-By: Claude Opus 5 --- PySSHClient.spec | 16 +++++++++++++++- README.md | 6 ++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/PySSHClient.spec b/PySSHClient.spec index a8882ed..970e070 100644 --- a/PySSHClient.spec +++ b/PySSHClient.spec @@ -7,14 +7,28 @@ d'attente a chaque demarrage. Le dossier demarre instantanement et se copie tout aussi bien sur une cle USB. """ +import os +import winpty + block_cipher = None +# pywinpty s'appuie sur deux executables auxiliaires que PyInstaller n'embarque pas +# tout seul (il ne suit que les DLL liees) : OpenConsole.exe pour le backend ConPTY, +# winpty-agent.exe pour le repli WinPTY. Sans eux, la pseudo-console se ferme +# instantanement au demarrage et les terminaux restent vides. +_winpty_dir = os.path.dirname(winpty.__file__) +_winpty_helpers = [ + (os.path.join(_winpty_dir, name), "winpty") + for name in ("OpenConsole.exe", "winpty-agent.exe") + if os.path.exists(os.path.join(_winpty_dir, name)) +] + a = Analysis( ["main.py"], pathex=[], binaries=[], # la feuille de style est lue au runtime : elle doit voyager avec l'application - datas=[("resources/theme.qss", "resources")], + datas=[("resources/theme.qss", "resources")] + _winpty_helpers, hiddenimports=["winpty"], hookspath=[], hooksconfig={}, diff --git a/README.md b/README.md index d20bb54..67f5a65 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,12 @@ Le format retenu est un dossier plutot qu'un fichier `.exe` unique : avec PySide unique doit decompresser environ 200 Mo a chaque lancement, ce qui ajoute plusieurs secondes d'attente a chaque demarrage. Le dossier demarre immediatement. +> **Note pour qui modifie la recette de build** (`PySSHClient.spec`) : `pywinpty` a besoin de deux +> executables auxiliaires, `OpenConsole.exe` (backend ConPTY) et `winpty-agent.exe` (repli WinPTY). +> PyInstaller ne suit que les DLL liees et les oublie : ils sont donc ajoutes explicitement dans +> `datas`. Sans eux, l'application se lance normalement mais **tous les terminaux se ferment +> instantanement** ("Deconnecte (Terminal ferme)"). + **Ou sont stockees les donnees ?** A cote de l'executable, dans son propre sous-dossier `data\` (mode portable : vos sessions et cles suivent la cle USB). Si cet emplacement n'est pas accessible en ecriture — installation dans `Program Files`, support en lecture seule — l'application bascule