Build: embarquer les executables auxiliaires de pywinpty
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 <noreply@anthropic.com>
This commit is contained in:
@@ -7,14 +7,28 @@ d'attente a chaque demarrage. Le dossier demarre instantanement et se copie tout
|
|||||||
aussi bien sur une cle USB.
|
aussi bien sur une cle USB.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import winpty
|
||||||
|
|
||||||
block_cipher = None
|
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(
|
a = Analysis(
|
||||||
["main.py"],
|
["main.py"],
|
||||||
pathex=[],
|
pathex=[],
|
||||||
binaries=[],
|
binaries=[],
|
||||||
# la feuille de style est lue au runtime : elle doit voyager avec l'application
|
# 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"],
|
hiddenimports=["winpty"],
|
||||||
hookspath=[],
|
hookspath=[],
|
||||||
hooksconfig={},
|
hooksconfig={},
|
||||||
|
|||||||
@@ -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
|
unique doit decompresser environ 200 Mo a chaque lancement, ce qui ajoute plusieurs secondes
|
||||||
d'attente a chaque demarrage. Le dossier demarre immediatement.
|
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\`
|
**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
|
(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
|
en ecriture — installation dans `Program Files`, support en lecture seule — l'application bascule
|
||||||
|
|||||||
Reference in New Issue
Block a user