92 votes

Comment cacher la fenêtre de la console en python ?

Je suis en train d'écrire un robot IRC en Python.

Je souhaite en faire des binaires autonomes pour Linux et Windows. Et surtout, je souhaite que lorsque le bot s'initie, la fenêtre de la console soit cachée et que l'utilisateur ne puisse pas voir cette fenêtre.

Qu'est-ce que je peux faire pour ça ?

6voto

Snidhi Sofpro Points 101

Quelques informations supplémentaires pour les situations qui nécessitent la solution win32gui postée par Mohsen Haddadi plus tôt dans ce fil :

A partir de python 361, win32gui & win32con ne font pas partie de la bibliothèque std de python. Pour les utiliser, le paquet pywin32 devra être installé ; maintenant possible via pip.

Plus d'informations sur le paquet pywin32 sont disponibles sur le site : Comment utiliser le module win32gui avec Python ? .

En outre, pour faire preuve de discernement lors de la fermeture d'une fenêtre afin de ne pas fermer par inadvertance une fenêtre au premier plan, la résolution pourrait être étendue de la manière suivante :

try     :

    import win32gui, win32con;

    frgrnd_wndw = win32gui.GetForegroundWindow();
    wndw_title  = win32gui.GetWindowText(frgrnd_wndw);
    if wndw_title.endswith("python.exe"):
        win32gui.ShowWindow(frgrnd_wndw, win32con.SW_HIDE);
    #endif
except  :
    pass

1voto

Après avoir écrit le code que vous voulez convertir le fichier de .py à .exe Vous pouvez donc utiliser pyinstaller et il est bon de faire exe fichier. Vous pouvez donc cacher la console de cette façon :

pyinstaller --onefile main.py --windowed

Je l'ai fait de cette façon et ça marche.

0voto

Vaibhav Shukla Points 40

Il suffit de changer l'extension du fichier de .py à .pyw

-1voto

mo-han Points 101

Une fabrique de décorateurs pour cela (version Windows, la version unix devrait être plus facile via os.fork )

def deco_factory_daemon_subprocess(*, flag_env_var_name='__this_daemon_subprocess__', **kwargs_for_subprocess):
    def deco(target):
        @functools.wraps(target)
        def tgt(*args, **kwargs):
            if os.environ.get(flag_env_var_name) == __file__:
                target(*args, **kwargs)
            else:
                os.environ[flag_env_var_name] = __file__
                real_argv = psutil.Process(os.getpid()).cmdline()
                exec_dir, exec_basename = path_split(real_argv[0])
                if exec_basename.lower() == 'python.exe':
                    real_argv[0] = shutil.which('pythonw.exe')
                kwargs = dict(env=os.environ, stdout=subprocess.PIPE, stderr=subprocess.PIPE, )
                kwargs.update(kwargs_for_subprocess)
                subprocess.Popen(real_argv, **kwargs)

        return tgt

    return deco

Utilisez-le comme ceci :

@deco_factory_daemon_subprocess()
def run():
    ...

def main():
    run()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X