Суть: Необходимо сделать запуск программы не привязанным к консоли. На 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
Собственно код выглядит вполне жизнеспособным, однако может я велосипед изобретаю или костялыми кидаюсь, просвятите пожалуйста.