Найти - Пользователи
Полная версия: Запуск скрипта оторванным от консоли Windows
Начало » Python для экспертов » Запуск скрипта оторванным от консоли Windows
1
JOHN_16
Приветствую всех.

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

Собственно код выглядит вполне жизнеспособным, однако может я велосипед изобретаю или костялыми кидаюсь, просвятите пожалуйста.
reclosedev
>pythonw test.py
Или test.py -> test.pyw и запускать даблкликом.

Оно?
JOHN_16
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
Может это?
JOHN_16
s0rg
Вот как бы уже близко к истине, только что то не получается. Дело в том что если просто вызвать
 from ctypes import windll
 windll.kernel32.FreeConsole()
То произойдет именно то что написано в документации - так как никакой более процесс не привязан к консоли изначального процесса, то консоль закроется, а вместе с ней и завершится процесс.
Если вызывать AllocConsole() то откроектся новая консоль, в которой будет происходить выполнение кода процесса и изначальная консоль будет в ожидании завершения дочерней.
Если поразмыслить,то представяется что я должен создать новую консоль, переключиться на изначальную, освободиться от нее, переключиться на новую консоль, которая к тому же как то скрыта должна быть. Однако подобных функций в доках в разделе про консоли не нашел.
Пока что еще думаю в этом направлении
s0rg
JOHN_16
Однако подобных функций в доках в разделе про консоли не нашел.
А это?
sanodin
Всегда для скрытия ком.строки пользовал vbs скрипт
Dim oShell
Set oShell = WScript.CreateObject ("WSCript.shell")
oShell.run "1.py", 0
Set oShell = Nothing
или .exe не важно

и вот средствами python…
тема очень пригодилась
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB