2010-05-21 15 views
6

J'ai développé une application Python qui s'exécute à la fois en mode graphique et en mode console. Si des arguments sont spécifiés, il s'exécute en mode console, sinon il s'exécute en mode graphique.Comment puis-je geler une application bimode (interface graphique et console) à l'aide de cx_Freeze?

J'ai réussi à le geler 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 là, il ne sort rien. Je ne reçois aucune erreur ou aucun message, donc il semble que cx_Feeze redirige la stdout ailleurs.

Est-il possible de le faire fonctionner avec les deux modes? Rien de semblable à cela ne semble être documenté nulle part. . :(

Merci à l'avance

mridang

Répondre

13

J'ai trouvé ce bit à la page this:

Astuce pour la version console moins: Si vous essayez d'imprimer quoi que ce soit, vous obtenir une fenêtre d'erreur méchant, parce que stdout et stderr n'existent pas (et le cx_freeze talon Win32gui.exe sera affiche une erreur Fenêtre). C'est une de douleur quand vous voulez que votre programme soit capable de fonctionner en mode GUI et en mode de ligne de commande . Pour désactiver en toute sécurité la sortie de la console , procédez comme suit 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 démarre en mode console moins , il fonctionnera même si la le code contient des instructions d'impression. Et s'il est exécuté en mode ligne de commande, il sera imprimé normalement comme . (Ceci est essentiellement ce que je faisais dans webGobbler, aussi.)

+0

J'ai mis cet extrait dans mon code, mais je reçois toujours une erreur. Cela pourrait avoir quelque chose à voir avec l'utilisation de colorama dans mon code, une bibliothèque qui produit du texte en couleur. Savez-vous comment résoudre ce problème aussi? J'ai ajouté [une capture d'écran] (http://i.imgur.com/1zVKo0c.png) pour clarifier l'erreur. J'espère que tu peux m'aider. –

2

Raymond Chen a écrit à ce sujet:.. http://blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx Bref, il est impossible directement sous Windows mais il y a des solutions de contournement

I'D . suggère deux expédition - executables cli et une IUG

+0

J'ai trouvé une solution de contournement comme le gars mentionné dans son poste. Regardez ma réponse ci-dessous. –