То, что я пытаюсь сделать, должно записать сценарий, который открыл бы приложение только в списке процессов. Значение его было бы "скрыто". Я даже не знаю если его возможное в Python.
Если бы не возможный, я согласился бы даже на функцию, которая позволила бы, чтобы программа была открыта с 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 под именем.
Какие-либо идеи?
Вы должны использовать 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."
Если отображается терминал, перенаправьте стандартный вывод процесса.
Какова цель?
если вы хотите, чтобы скрытый (без окна) процесс работал в фоновом режиме, лучшим способом было бы написать службу 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