Как скрыть окно консоли в python?

Я пишу IRC-бота на Python.

Я хочу сделать из него отдельные бинарники для Linux и Windows. И в основном я хочу, чтобы при запуске бота окно консоли скрывалось, и пользователь не мог видеть окно.

Что я могу для этого сделать?


person Community    schedule 19.04.2009    source источник
comment
Связано: Запустить скрипт python без появления оболочки DOS   -  person Piotr Dobrogost    schedule 18.10.2012


Ответы (7)


Просто сохраните его с расширением .pyw. Это предотвратит открытие окна консоли.

В системах Windows нет понятия «исполняемый режим». Программа установки Python автоматически связывает файлы .py с python.exe, поэтому двойной щелчок по файлу Python запустит его как сценарий. Расширение также может быть .pyw, в этом случае окно консоли, которое обычно появляется, скрыто.

Пояснение внизу раздела 2.2.2

person mdec    schedule 19.04.2009
comment
В этой ссылке нет раздела 2.2.2. Почему вы не разместили объяснение здесь? - person mcont; 19.08.2015
comment
Есть раздел 2.2.2. docs.python.org/2.6/tutorial/ - person Marlon Abeykoon; 29.08.2016

В линуксе просто запустите его, без проблем. В Windows вы хотите использовать исполняемый файл pythonw.

Обновлять

Хорошо, если я правильно понял вопрос в комментариях, вы спрашиваете, как сделать так, чтобы командное окно, в котором вы запускали бота из командной строки, потом исчезло?

  • ЮНИКС (Линукс)

$ nohup mypythonprog &

  • Окна

C:/> запустить pythonw mypythonprog

Я думаю, это правильно. В любом случае, теперь вы можете закрыть терминал.

person Charlie Martin    schedule 19.04.2009
comment
Это не главная проблема ... Основная проблема заключается в том, чтобы скрыть окно консоли, когда программа запущена. Как это сделать? - person ; 19.04.2009
comment
Ты имеешь в виду тот, с которого ты его начинаешь? - person Charlie Martin; 19.04.2009
comment
Измените расширение файла на .pyw, чтобы связать его с pythonw.exe oreilly.com/catalog/pythonwin32/ глава/ch20.html - person mechanical_meat; 19.04.2009
comment
nohup mypythonprog & поможет мне в Linux ... но python не будет установлен на машине с Windows. Так что запустите pythonw mypythonprog, я думаю, мне не поможет. - person ; 19.04.2009
comment
Хорошо, если puython не установлен, у вас другая проблема. Вы хотите, чтобы py2exe создал автономный исполняемый файл. logix4u.net/Python/Tutorials/ и py2exe.org/index.cgi/FrontPage - person Charlie Martin; 19.04.2009
comment
unix ≠ Linux, unix ≠ UNIX, приведенное выше решение также работает для macOS и BSD (они unix), без форматирования кода. - person noɥʇʎԀʎzɐɹƆ; 16.01.2017
comment
О, я понимаю. На самом деле unix == UNIX и не беспокойте своих старших. - person Charlie Martin; 16.01.2017

В системах Unix (включая GNU/Linux, macOS и BSD)

Используйте nohup mypythonprog &, и вы сможете закрыть окно терминала, не прерывая процесс. Вы также можете запустить exit, если вы работаете в облаке и не хотите оставлять зависший процесс оболочки.

В системах Windows

Сохраните программу с расширением .pyw и теперь она будет открываться с расширением pythonw.exe. Нет окна оболочки.

Например, если у вас есть foo.py, вам нужно переименовать его в foo.pyw.

person noɥʇʎԀʎzɐɹƆ    schedule 01.03.2013

Это скроет вашу консоль. Сначала внедрите эти строки в свой код, чтобы сначала начать скрывать консоль.

import win32gui, win32con

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

Обновление от мая 2020 г.:

Если у вас возникли проблемы с pip install win32con в командной строке, вы можете просто pip install pywin32. Затем в своем скрипте Python выполните import win32.lib.win32con as win32con вместо import win32con.

Чтобы снова отобразить вашу программу, win32con.SW_SHOW отлично работает:

win32gui.ShowWindow(the_program_to_hide , win32con.SW_SHOW)
person Mohsen Haddadi    schedule 14.03.2018
comment
Пожалуйста, объясните свой код на английском языке. Спасибо! Кто-то, кто не нуждается в объяснении, мог бы написать это сам. - person jpaugh; 14.03.2018
comment
Тем не менее, при запуске этого терминала ненадолго появится всплывающее окно. - person Simon; 19.05.2018
comment
Это очень полезно, я просто вставляю его в начале своего кода. - person Karam Qusai; 25.07.2019
comment
что, если я хочу остановить эту терминальную линию? - person Karam Qusai; 25.07.2019
comment
чтобы снова отобразить скрытую программу, используйте эту строку: win32gui.ShowWindow(The_program_to_hide, win32con.SW_SHOW) - person Mohsen Haddadi; 26.07.2019
comment
это спасло меня от раздражающей проблемы, которая у меня была, спасибо :) - person Isquare1; 04.08.2020

Если все, что вы хотите сделать, это запустить свой скрипт Python на компьютере с Windows, на котором установлен интерпретатор Python, преобразование расширения вашего сохраненного скрипта из «.py» в «.pyw» должно помочь.

Но если вы используете py2exe для преобразования своего скрипта в отдельное приложение, которое будет работать на любом компьютере с Windows, вам потребуется внести следующие изменения в файл setup.py.

Следующий пример представляет собой простой графический интерфейс Python, созданный с использованием Tkinter:

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

Измените «консоль» в приведенном выше коде на «окна».

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

Это откроет только сгенерированный Tkinter графический интерфейс, а не окно консоли.

person John918    schedule 25.11.2016
comment
Хотя я чувствую, что этот ответ немного не по теме вопроса, я все равно опубликовал его, поскольку он отвечает на следующий вопрос (ссылка ниже), который был помечен как дубликат этого вопроса. - person John918; 25.11.2016
comment
stackoverflow.com/questions/31501769/ - person John918; 25.11.2016
comment
На самом деле я использую pyinstaller, но у него есть опция для того же (-w), что решило проблему для меня. - person ChrisWue; 11.04.2018

Некоторая дополнительная информация. для ситуаций, когда потребуется решение win32gui, опубликованное Мохсеном Хаддади ранее в этой теме:

Начиная с python 361, win32gui и win32con не являются частью стандартной библиотеки python. Для их использования необходимо установить пакет pywin32; теперь возможно через pip.

Дополнительная справочная информация о пакете pywin32 находится по адресу: Как использовать модуль win32gui с Питон?.

Кроме того, чтобы применить осторожность при закрытии окна, чтобы непреднамеренно не закрыть какое-либо окно на переднем плане, разрешение может быть расширено следующим образом:

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
person Snidhi Sofpro    schedule 20.03.2018
comment
Почему бы просто не использовать расширение *.pyw? Это чрезмерно долго. - person Anonymous; 26.04.2018
comment
Использование расширения .pyw может не подойти в таких случаях использования, как сервер Cgi (http.server) на локальном хосте. Потому что в таких случаях скрипт Python в конечном итоге выполняется python.exe, несмотря на расширение .pyw. - person Snidhi Sofpro; 26.04.2018
comment
Тем не менее, при запуске этого терминала ненадолго появится всплывающее окно. - person Simon; 19.05.2018
comment
Ах, а что, если вы сделаете что-то вроде этого: 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 - person Anonymous; 05.06.2018
comment
@Anonymous Иногда вам нужно иметь более точный контроль над тем, отображается ли консоль или нет. Когда я замораживаю программу с помощью Pyinstaller, я хочу, чтобы консоль была там, чтобы я мог читать ошибки, если упаковка не сработала, и скрывать консоль, если все идет хорошо. - person Guimoute; 06.05.2021

фабрика декораторов для этого (версия для Windows, версия для Unix должна быть проще через 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

используйте это так:

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


def main():
    run()
person mo-han    schedule 29.05.2021