Форум сайта python.su
Приветствую всех.
Суть: Необходимо сделать запуск программы не привязанным к консоли. На linux ( и других UNIX подобных) это легко решается с помощью т.н. magic double fork.
Вопрос: как сделать по простому в Windows?
Гугление в основном приводит к использованию win32 библиотеки и оформлению кода как Windows Service, что несколько нежелательно (именно привязыватсья к сторонней библиотеки, причем относительно тяжелой).
Подумав и поразмывлив я пришел к некоторому решению, онснованное на особенностях Win32API в частности на флаги функции CreateProcess. Идея в том что при старте код проверяет некое условие и если оно удовлетворительно перезапускает себя же но уже с необходимым флагом. Ниже условный тестовый пример.
# -*- coding: utf-8 -*- import sys, os , optparse, subprocess, time, traceback from win32process import CREATE_NO_WINDOW # выведим текущий номер процесса print 'Process ID = {}\n'.format(os.getpid()) # Проверка аргументов на ключ указывающий на перезапуск скрипта с оторванной консолью if len(sys.argv)>1 and 'hide' in sys.argv: subprocess.Popen([__file__], shell=True, creationflags=CREATE_NO_WINDOW) sys.exit() # основное тело кода with open('test_{}.log'.format(os.getpid()), 'w') as log: while True: try: log.write('Process ID = {}{}'.format(os.getpid(), os.linesep)) log.flush() time.sleep(1) except BaseException: break
C:\ser>python test.py hide Process ID = 1580
Офлайн
>pythonw test.py
Офлайн
reclosedev
как альтернативный метод возможный вариант. Но не совсем то, поясню:
хочется создать кроссплатформенную программу, которая бы вызывалась как обычно, и где то внутри себя отрывалась от консоли, или не отрывалась в зависимости от опций командной строки. Структурно она выглядела бы так:
class A():
def __init__():
parser()
if option:
if linux:
magic_double_fork()
elif Windows:
some_code_to_detach_console()
def main():
main_code()
Офлайн
Офлайн
s0rg
Вот как бы уже близко к истине, только что то не получается. Дело в том что если просто вызвать
from ctypes import windll windll.kernel32.FreeConsole()
Офлайн
Офлайн
Всегда для скрытия ком.строки пользовал vbs скрипт
Dim oShell Set oShell = WScript.CreateObject ("WSCript.shell") oShell.run "1.py", 0 Set oShell = Nothing
Офлайн