Comment puis-je congeler une application à double mode (GUI et console) en utilisant cx_Freeze?

StackOverflow https://stackoverflow.com/questions/2883205

  •  04-10-2019
  •  | 
  •  

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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top