Wie verstecke ich das Konsolenfenster in Python?

77

Ich schreibe einen IRC-Bot in Python.

Ich möchte daraus eigenständige Binärdateien für Linux und Windows erstellen. Und hauptsächlich wünsche ich mir, dass beim Starten des Bots das Konsolenfenster ausgeblendet wird und der Benutzer das Fenster nicht sehen kann.

Was kann ich dafür tun?

nbro
quelle

Antworten:

129

Speichern Sie es einfach mit einer .pywErweiterung. Dadurch wird verhindert, dass sich das Konsolenfenster öffnet.

Auf Windows-Systemen gibt es keine Vorstellung von einem „ausführbaren Modus“. Das Python-Installationsprogramm verknüpft .py-Dateien automatisch mit python.exe, sodass ein Doppelklick auf eine Python-Datei diese als Skript ausführt. Die Erweiterung kann auch .pyw sein. In diesem Fall wird das normalerweise angezeigte Konsolenfenster unterdrückt.

Erläuterung am Ende von Abschnitt 2.2.2

mdec
quelle
2
Dieser Link enthält keinen Abschnitt 2.2.2. Warum hast du die Erklärung nicht hier gepostet?
Mcont
1
Es gibt einen Abschnitt 2.2.2. docs.python.org/2.6/tutorial/…
Marlon Abeykoon
37

Führen Sie es unter Linux einfach aus, kein Problem. In Windows möchten Sie die ausführbare Datei pythonw verwenden.

Aktualisieren

Okay, wenn ich die Frage in den Kommentaren verstehe, fragen Sie, wie das Befehlsfenster, in dem Sie den Bot über die Befehlszeile gestartet haben, danach ausgeblendet wird?

  • UNIX (Linux)

$ nohup mypythonprog &

  • Windows

C: /> starte pythonw mypythonprog

Ich denke das ist richtig. In jedem Fall können Sie jetzt das Terminal schließen.

Charlie Martin
quelle
Das ist nicht das Hauptproblem ... Das Hauptproblem besteht darin, das Konsolenfenster auszublenden, während das Programm ausgeführt wird. Wie macht es das?
Du meinst den, von dem du es startest?
Charlie Martin
1
Ändern Sie die Dateierweiterung zu assoziieren mit pythonw.exe .pyw oreilly.com/catalog/pythonwin32/chapter/ch20.html
mechanical_meat
"nohup mypythonprog &" hilft mir unter Linux ... aber Python wird nicht auf dem Windows-Computer installiert. Also "start pythonw mypythonprog" wird mir wohl nicht helfen.
2
Oh, ich verstehe. Eigentlich Unix == UNIX und belästige deine Ältesten nicht.
Charlie Martin
22

Auf Unix-Systemen (einschließlich GNU / Linux, macOS und BSD)

Verwenden Sie nohup mypythonprog &, und Sie können das Terminalfenster schließen, ohne den Prozess zu stören. Sie können auch ausgeführt werden, exitwenn Sie in der Cloud ausgeführt werden und keinen hängenden Shell-Prozess verlassen möchten.

Auf Windows-Systemen

Speichern Sie das Programm mit einer .pywErweiterung und jetzt wird es mit geöffnet pythonw.exe. Kein Shell-Fenster.

Wenn Sie dies beispielsweise getan haben foo.py, müssen Sie es in umbenennen foo.pyw.

noɥʇʎԀʎzɐɹƆ
quelle
16

Dadurch wird Ihre Konsole ausgeblendet. Implementieren Sie diese Zeilen zuerst in Ihren Code, um zunächst Ihre Konsole auszublenden.

import win32gui, win32con

the_program_to_hide = win32gui.GetForegroundWindow()
win32gui.ShowWindow(the_program_to_hide , win32con.SW_HIDE)

Update Mai 2020:

Wenn Sie Probleme mit der pip install win32conEingabeaufforderung haben, können Sie einfach. pip install pywin32Dann in Ihrem Python-Skript ausführen import win32.lib.win32con as win32conanstatt import win32con.

Das erneute Anzeigen Ihres Programms win32con.SW_SHOWfunktioniert einwandfrei:

win32gui.ShowWindow(the_program_to_hide , win32con.SW_SHOW)
Mohsen Haddadi
quelle
1
Bitte erläutern Sie Ihren Code auf Englisch. Vielen Dank! Jemand, der keine Erklärung braucht, hätte sie selbst schreiben können.
Jpaugh
Das Terminal wird jedoch kurz angezeigt, wenn dies ausgeführt wird.
Simon
Dies ist sehr hilfreich, ich füge es einfach in das Betteln meines Codes ein.
Karam Qusai
1
Was ist, wenn ich diese Terminalleitung stoppen möchte?
Karam Qusai
1
Um das versteckte Programm erneut anzuzeigen, verwenden Sie diese Zeile: win32gui.ShowWindow (The_program_to_hide, win32con.SW_SHOW)
Mohsen Haddadi
11

Wenn Sie Ihr Python-Skript nur auf einem Windows-Computer ausführen möchten, auf dem der Python-Interpreter installiert ist, sollte die Konvertierung der Erweiterung Ihres gespeicherten Skripts von ".py" in ".pyw" ausreichen.

Wenn Sie jedoch py2exe verwenden, um Ihr Skript in eine eigenständige Anwendung zu konvertieren, die auf jedem Windows-Computer ausgeführt werden kann, müssen Sie die folgenden Änderungen an Ihrer Datei "setup.py" vornehmen.

Das folgende Beispiel zeigt eine einfache Python-GUI, die mit Tkinter erstellt wurde:

from distutils.core import setup
import py2exe
setup (console = ['tkinter_example.pyw'],
       options = { 'py2exe' : {'packages':['Tkinter']}})

Ändern Sie "Konsole" im obigen Code in "Windows".

from distutils.core import setup
import py2exe
setup (windows = ['tkinter_example.pyw'],
       options = { 'py2exe' : {'packages':['Tkinter']}})

Dadurch wird nur die von Tkinter generierte Benutzeroberfläche und kein Konsolenfenster geöffnet.

John918
quelle
Obwohl ich der Meinung bin, dass diese Antwort ein wenig vom Thema der Frage abweicht, habe ich sie trotzdem veröffentlicht, da sie die folgende Frage (den Link unten) beantwortet, die als Duplikat dieser Frage markiert wurde.
John918
Ich benutze eigentlich Pyinstaller, aber das hat eine Option für das gleiche (-w) und hat das Problem für mich behoben.
ChrisWue
4

Einige zusätzliche Informationen. für Situationen, in denen die von Mohsen Haddadi weiter oben in diesem Thread veröffentlichte win32gui-Lösung erforderlich ist:

Ab Python 361 sind win32gui und win32con nicht Teil der Python-Standardbibliothek. Um sie zu verwenden, muss das pywin32-Paket installiert sein. jetzt über pip möglich.

Weitere Hintergrundinformationen zum pywin32-Paket finden Sie unter: Wie verwende ich das win32gui-Modul mit Python? .

Um beim Schließen eines Fensters Diskretion zu walten und kein Fenster im Vordergrund versehentlich zu schließen, kann die Auflösung wie folgt erweitert werden:

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
Snidhi Sofpro
quelle
Warum nicht einfach die Erweiterung * .pyw verwenden? Das ist zu lang.
Anonym
2
Die Verwendung der Erweiterung .pyw ist in Anwendungsfällen wie einem Cgi-Server (http.server) auf localhost möglicherweise keine Lösung. In solchen Fällen wird das Python-Skript trotz der Erweiterung .pyw von python.exe ausgeführt.
Snidhi Sofpro
Das Terminal wird jedoch kurz angezeigt, wenn dies ausgeführt wird.
Simon
Ah, aber was ist, wenn Sie so etwas getan haben:import os,sys if sys.args[-1]!='Y': os.system('pythonw myprog.py Y') # or whatever your program's name is # Your program's code
Anonym