Comment puis-je congeler une application à double mode (GUI et console) en utilisant cx_Freeze?
Question
J'ai développé une application Python qui fonctionne aussi bien en mode graphique et le mode console. Si les arguments sont spécifiés, il fonctionne en mode console sinon il fonctionne en mode graphique.
J'ai réussi à geler ce en utilisant cx_Freeze. J'ai eu quelques problèmes qui se cachent la fenêtre de la console noire qui pop avec wxPython et je modifié mon script setup.py
comme ceci:
import sys
from cx_Freeze import setup, Executable
base = None
if sys.platform == "win32":
base = "Win32GUI"
setup(
name = "simple_PyQt4",
version = "0.1",
description = "Sample cx_Freeze PyQt4 script",
executables = [Executable("PyQt4app.py", base = base)])
Cela fonctionne bien, mais maintenant, quand je tente d'ouvrir ma console et lancez l'exécutable à partir de là, il ne émet. Je ne reçois pas d'erreurs ou de messages il semble que cx_Feeze réoriente le stdout ailleurs.
Est-il possible de le faire fonctionner à la fois en mode? Rien de semblable à ce qui semble être documenté nulle part. : (
Merci à l'avance.
mridang
La solution
J'ai trouvé ce peu sur cette page :
Astuce pour la version console moins: Si vous essayez d'imprimer quoi que ce soit, vous voulez Une fenêtre d'erreur méchant, parce que stdout et stderr n'existent pas (et le talon cx_freeze Win32gui.exe volonté afficher une fenêtre d'erreur). C'est un douleur quand vous voulez que votre programme soit capable de fonctionner en mode graphique et mode ligne de commande. Pour désactiver en toute sécurité sortie de la console, ne suit à la au début de votre programme:
try:
sys.stdout.write("\n")
sys.stdout.flush()
except IOError:
class dummyStream:
''' dummyStream behaves like a stream but does nothing. '''
def __init__(self): pass
def write(self,data): pass
def read(self,data): pass
def flush(self): pass
def close(self): pass
# and now redirect all default streams to this dummyStream:
sys.stdout = dummyStream()
sys.stderr = dummyStream()
sys.stdin = dummyStream()
sys.__stdout__ = dummyStream()
sys.__stderr__ = dummyStream()
sys.__stdin__ = dummyStream()
De cette façon, si le programme commence à en mode console moins, il fonctionnera même si le code contient des instructions d'impression. Et si elle est exécutée en mode ligne de commande, il imprimera comme d'habitude. (C'est essentiellement ce que je faisais dans webGobbler, trop.)
Autres conseils
Raymond Chen a écrit à ce sujet: http: //blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx . En bref, il est impossible directement sous Windows mais il y a des solutions de contournement.
Je vous suggère l'expédition deux executables -. Un cli et IUG