2014-01-07 98 views
1

我想通過使用Python代碼的Windows服務打開/執行另一個程序。當Windows服務啓動時,另一個程序即記事本將被執行。代碼沒有錯誤,但沒有打開程序。代碼如下。通過使用Python的Windows服務打開另一個程序

代碼:

import win32serviceutil 
import win32service 
import win32event 
import win32com.shell.shell as w32shell 
import os 
import sys 
import win32process as process 

class SmallestPythonService(win32serviceutil.ServiceFramework): 
    _svc_name_ = "BSmallestPythonService" 
    _svc_display_name_ = "BSmallest possible Python Service" 
def __init__(self, args): 
    win32serviceutil.ServiceFramework.__init__(self, args) 
    # Create an event which we will use to wait on. 
    # The "service stop" request will set this event. 
    self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) 


def SvcStop(self): 
    # Before we do anything, tell the SCM we are starting the stop process. 
    self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
    # And set my event. 
    win32event.SetEvent(self.hWaitStop) 

def SvcDoRun(self): 
    win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) 
    import subprocess 
    cmd = "notepad.exe" 
    process = subprocess.Popen(cmd, stdout=subprocess.PIPE, creationflags=0x08000000) 
    process.wait() 

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

在SvcDoRun方法我試過下面的代碼,但沒有成功:

import subprocess 
subprocess.Popen('calc.exe', shell=False) 

也試過,但沒有成功:

import subprocess 
subprocess.call('notepad.exe', shell=False) 

也試過但沒有成功:

import win32api 
win32api.WinExec('NOTEPAD.exe') # Works seamlessly 

我錯過了什麼?或者我以錯誤的方式去做!請幫助

回答

3

Windows服務在會話0中運行,交互式程序在不同的會話中運行。通常,當有一個登錄用戶時,這將是會話1。現在,您的代碼將在會話0中創建進程,因爲它在會話0中運行。所以會話1中的交互式用戶桌面無法與這些進程交互。

有可能啓動過程中從工藝母體不同的會話中運行,但它並不容易:http://blogs.msdn.com/b/winsdk/archive/2009/07/14/launching-an-interactive-process-from-windows-service-in-windows-vista-and-later.aspx

一個可能的出路,你是運行啓動時,後臺進程每個用戶登錄。該服務可以使用IPC與後臺進程進行通信,並要求後臺進程在交互式桌面中完成啓動進程的工作。

相關問題