Як приховати вікно консолі в python?


77

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

Я хочу зробити окремі двійкові файли для Linux та Windows. І головним чином я бажаю, щоб при ініціюванні бота вікно консолі ховалося, а користувач не міг бачити вікно.

Що я можу зробити для цього?


Відповіді:


130

Просто збережіть його з .pywрозширенням. Це запобіжить відкриттю вікна консолі.

У системах Windows поняття "виконуваний режим" не існує. Інсталятор Python автоматично пов'язує файли .py з python.exe, так що подвійне клацання файлу Python запускає його як сценарій. Розширенням також може бути .pyw, у такому випадку вікно консолі, яке зазвичай з’являється, пригнічується.

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


2
У цьому посиланні немає розділу 2.2.2. Чому ви не розмістили пояснення тут?
mcont


38

У Linux просто запустіть, не проблема. У Windows ви хочете використовувати виконуваний файл pythonw.

Оновлення

Гаразд, якщо я розумію питання в коментарях, ви запитуєте, як змусити пізніше зникнути командне вікно, в якому ви запустили бота з командного рядка?

  • UNIX (Linux)

$ nohup mypythonprog &

  • Windows

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

Я думаю , це правильно. У будь-якому випадку, тепер ви можете закрити термінал.


Це не головна проблема ... Основна проблема полягає в тому, щоб приховати вікно консолі, тоді програма працює. Як це зробити?

Ви маєте на увазі того, з кого ви його починаєте?
Чарлі Мартін,

1
Змінити розширення файлу на .pyw для зв’язку з pythonw.exe oreilly.com/catalog/pythonwin32/chapter/ch20.html
mechanical_meat

"nohup mypythonprog &" допоможе мені в Linux ... але python не збирається встановлювати на машині Windows. Тож "запустити pythonw mypythonprog" не допоможе мені, я здогадуюсь.

2
О Я розумію. Насправді unix == UNIX і не переслідуйте своїх старших.
Чарлі Мартін,

24

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

Використовуйте nohup mypythonprog &, і ви можете закрити вікно терміналу, не порушуючи процес. Ви також можете бігатиexit якщо ви працюєте в хмарі і не хочете залишати висячий процес оболонки.

На системах Windows

Збережіть програму з .pywрозширенням, і тепер вона відкриється за допомогою pythonw.exe. Немає вікна оболонки.

Наприклад, якщо у вас є foo.py, вам потрібно перейменувати його на foo.pyw.


16

Це приховає вашу консоль. Спочатку впровадьте ці рядки у свій код, щоб спочатку почати приховувати консоль.

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)

1
Будь ласка, поясніть свій код англійською мовою. Дякую! Той, хто не потребує пояснення, міг би написати його самостійно.
jpaugh

При запуску цього термінал ненадовго з’явиться.
Саймон

Це дуже корисно, я просто вставляю це в прохання мого коду.
Карам

1
що якщо я хочу зупинити цю лінію терміналу?
Karam

1
щоб знову показати приховану програму, використовуйте цей рядок: win32gui.ShowWindow (The_program_to_hide, win32con.SW_SHOW)
Mohsen

11

Якщо все, що ви хочете зробити, це запустити ваш Python Script на комп’ютері з ОС 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']}})

Змініть "console" у коді вище на "windows" ..

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

Це відкриє лише графічний інтерфейс, згенерований Tkinter, а не вікно консолі.


Хоча я відчуваю, що ця відповідь трохи не відповідає темі на питання, я все-таки продовжив і опублікував її, оскільки вона відповідає на наступне питання (посилання нижче), яке було позначено як дублікат цього питання.
John918,


Я фактично використовую pyinstaller, але у нього є опція для того ж самого (-w), і для мене вирішено проблему.
ChrisWue

4

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

Починаючи з python 361, win32gui та win32con не є частиною бібліотеки std python. Для їх використання потрібно встановити пакет pywin32; тепер можливо через pip.

Більше довідкової інформації про пакет pywin32 можна знайти за адресою: Як використовувати модуль win32gui з Python? .

Крім того, щоб застосувати розсуд під час закриття вікна, щоб ненавмисно не закрити жодне вікно на передньому плані, роздільна здатність може бути розширена у такий спосіб:

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

Чому б просто не використовувати розширення * .pyw? Це надмірно довго.
Анонім

2
Використання розширення .pyw може не бути рішенням у випадках використання, наприклад, із сервером Cgi (http.server) на localhost. Оскільки в таких випадках сценарій python закінчується виконанням python.exe, незважаючи на розширення .pyw.
Снідхі Софпро

При запуску цього термінал ненадовго з’явиться.
Саймон

А, а що, якби ви зробили щось подібне: 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
Анонім
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.