Откройте программу с уменьшенным или скрытым Python - PullRequest
6 голосов
/ 23 февраля 2010

Я пытаюсь написать скрипт, который бы открывал приложение только в списке процессов. То есть это будет «скрыто». Я даже не знаю, возможно ли это на питоне.

Если это невозможно, я бы согласился даже на функцию, которая позволяла бы открывать программу с python в свернутом состоянии, может быть что-то вроде этого:

import subprocess
def startProgram():
    subprocess.Hide(subprocess.Popen('C:\test.exe')) #  I know this is wrong but you get the idea...
startProgram()

Кто-то предложил использовать win32com.client, но дело в том, что в программе, которую я хочу запустить, не зарегистрирован COM-сервер под этим именем.

Есть идеи?

Ответы [ 4 ]

15 голосов
/ 20 августа 2015

Это просто :)
Python Popen Принять STARTUPINFO Структура ...
О СТАРТУПИНФО Структура: https://msdn.microsoft.com/en-us/library/windows/desktop/ms686331(v=vs.85).aspx

Run Hidden:

import subprocess

def startProgram():
    SW_HIDE = 0
    info = subprocess.STARTUPINFO()
    info.dwFlags = subprocess.STARTF_USESHOWWINDOW
    info.wShowWindow = SW_HIDE
    subprocess.Popen(r'C:\test.exe', startupinfo=info)
startProgram()

Выполнение свернуто:

import subprocess

def startProgram():
    SW_MINIMIZE = 6
    info = subprocess.STARTUPINFO()
    info.dwFlags = subprocess.STARTF_USESHOWWINDOW
    info.wShowWindow = SW_MINIMIZE
    subprocess.Popen(r'C:\test.exe', startupinfo=info)
startProgram()
7 голосов
/ 24 февраля 2010

Вы должны использовать win32api и скрыть свое окно, например. используя win32gui.EnumWindows , вы можете перечислить все верхние окна и скрыть свое окно

Вот небольшой пример, вы можете сделать что-то вроде этого:

import subprocess
import win32gui
import time

proc = subprocess.Popen(["notepad.exe"])
# lets wait a bit to app to start
time.sleep(3)

def enumWindowFunc(hwnd, windowList):
    """ win32gui.EnumWindows() callback """
    text = win32gui.GetWindowText(hwnd)
    className = win32gui.GetClassName(hwnd)
    #print hwnd, text, className
    if text.find("Notepad") >= 0:
        windowList.append((hwnd, text, className))

myWindows = []
# enumerate thru all top windows and get windows which are ours
win32gui.EnumWindows(enumWindowFunc, myWindows)

# now hide my windows, we can actually check process info from GetWindowThreadProcessId
# http://msdn.microsoft.com/en-us/library/ms633522(VS.85).aspx
for hwnd, text, className in myWindows:
    win32gui.ShowWindow(hwnd, False)

# as our notepad is now hidden
# you will have to kill notepad in taskmanager to get past next line
proc.wait()
print "finished."
1 голос
/ 23 февраля 2010

Какова цель?

если вы хотите, чтобы скрытый (без окон) процесс работал в фоновом режиме, лучшим способом было бы написать службу Windows и запускать / останавливать ее, используя обычный механизм службы окна. Служба Windows может быть легко написана на python, например вот часть моего собственного сервиса (он не будет работать без каких-либо модификаций)

import os
import time
import traceback

import pythoncom
import win32serviceutil
import win32service
import win32event
import servicemanager

import jagteraho


class JagteRahoService (win32serviceutil.ServiceFramework):
    _svc_name_ = "JagteRaho"
    _svc_display_name_ = "JagteRaho (KeepAlive) Service"
    _svc_description_ = "Used for keeping important services e.g. broadband connection up"

    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.stop = False

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        self.log('stopping')
        self.stop = True

    def log(self, msg):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_,msg))

    def SvcDoRun(self):
        self.log('folder %s'%os.getcwd())
        self.ReportServiceStatus(win32service.SERVICE_RUNNING)
        self.start()

    def shouldStop(self):
        return self.stop

    def start(self):
        try:
            configFile = os.path.join(jagteraho.getAppFolder(), "jagteraho.cfg")
            jagteraho.start_config(configFile, self.shouldStop)
        except Exception,e:
            self.log(" stopped due to eror %s [%s]" % (e, traceback.format_exc()))
        self.ReportServiceStatus(win32service.SERVICE_STOPPED)


if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(AppServerSvc)

и вы можете установить его по

python svc_jagteraho.py--startup auto install

и запустите его по

python python svc_jagteraho.py start

Меня также будут видеть в списке услуг, например services.msc покажет его, и вы можете запустить / остановить его, в противном случае вы можете использовать командную строку

sc stop jagteraho
0 голосов
/ 23 февраля 2010

Если то, что появляется, является терминалом, перенаправьте стандартный вывод процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...