Я пишу IRC-бота на Python.
Я хочу сделать из него отдельные бинарники для Linux и Windows. И в основном я хочу, чтобы при запуске бота окно консоли скрывалось, и пользователь не мог видеть окно.
Что я могу для этого сделать?
Я пишу IRC-бота на Python.
Я хочу сделать из него отдельные бинарники для Linux и Windows. И в основном я хочу, чтобы при запуске бота окно консоли скрывалось, и пользователь не мог видеть окно.
Что я могу для этого сделать?
Просто сохраните его с расширением .pyw
. Это предотвратит открытие окна консоли.
В системах Windows нет понятия «исполняемый режим». Программа установки Python автоматически связывает файлы .py с python.exe, поэтому двойной щелчок по файлу Python запустит его как сценарий. Расширение также может быть .pyw, в этом случае окно консоли, которое обычно появляется, скрыто.
В линуксе просто запустите его, без проблем. В Windows вы хотите использовать исполняемый файл pythonw.
Хорошо, если я правильно понял вопрос в комментариях, вы спрашиваете, как сделать так, чтобы командное окно, в котором вы запускали бота из командной строки, потом исчезло?
$ nohup mypythonprog &
C:/> запустить pythonw mypythonprog
Я думаю, это правильно. В любом случае, теперь вы можете закрыть терминал.
Используйте nohup mypythonprog &
, и вы сможете закрыть окно терминала, не прерывая процесс. Вы также можете запустить exit
, если вы работаете в облаке и не хотите оставлять зависший процесс оболочки.
Сохраните программу с расширением .pyw
и теперь она будет открываться с расширением pythonw.exe
. Нет окна оболочки.
Например, если у вас есть foo.py
, вам нужно переименовать его в foo.pyw
.
Это скроет вашу консоль. Сначала внедрите эти строки в свой код, чтобы сначала начать скрывать консоль.
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)
Если все, что вы хотите сделать, это запустить свой скрипт 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 графический интерфейс, а не окно консоли.
Некоторая дополнительная информация. для ситуаций, когда потребуется решение 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
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
фабрика декораторов для этого (версия для 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()