Come posso congelare un dual-mode (GUI e console) applicazione che utilizza cx_Freeze?

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

  •  04-10-2019
  •  | 
  •  

Domanda

Ho sviluppato un'applicazione Python che funziona sia in modalità GUI e la modalità console. Se vengono specificati argomenti, viene eseguito in una modalità console altrimenti viene eseguito in modalità GUI.

sono riuscito a congelare questo utilizzando cx_Freeze. Ho avuto qualche problema che nascondono la finestra della console nera che si solleva con wxPython e così ho modificato il mio script setup.py in questo modo:

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)])

Questo funziona bene, ma ora quando provo ad aprire la mia console ed eseguire il file eseguibile da lì, non è così uscita nulla. Non capisco eventuali errori o messaggi così sembra che cx_Feeze reindirizza lo stdout da qualche altra parte.

Is è possibile farlo funzionare con entrambe le modalità? Nulla di simile a questo sembra essere documentata da nessuna parte. : (

Grazie in anticipo.

Mridang

È stato utile?

Soluzione

Ho trovato questo bit su questa pagina :

  

Suggerimento per la versione console-meno: se   Si tenta di stampare qualsiasi cosa, si vuole   ottenere una finestra di errore brutto, perché   stdout e stderr non esistono (e   il cx_freeze Win32gui.exe stub volontà   visualizzare una finestra di errore). Questo è un   dolore quando si desidera che il programma sia   in grado di funzionare in modalità GUI e   modalità riga di comando. Per disabilitare in modo sicuro   output della console, fare come segue agli   all'inizio del programma:

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()
  

In questo modo, se il programma viene avviato in   modalità console-less, funzionerà ancora   se il codice contiene dichiarazioni di stampa.   E se eseguito in modalità riga di comando, è   stamperà come al solito. (Questo è   in pratica quello che ho fatto in WebGobbler,   troppo.)

Altri suggerimenti

Raymond Chen ha scritto su questo: http: //blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx . In breve, non è possibile direttamente in Windows, ma ci sono alcune soluzioni.

Io suggerirei di spedizione due file eseguibili -. Uno cli e gui

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top