2010-02-23 11 views
5

के साथ एक प्रोग्राम खोलें जो मैं करने की कोशिश कर रहा हूं वह एक स्क्रिप्ट लिखना है जो केवल प्रक्रिया सूची में एप्लिकेशन खोल देगा। मतलब यह "छुपा" होगा। मुझे यह भी पता नहीं है कि यह पाइथन में संभव है या नहीं।पायथन को कम या छुपा

संभव नहीं है, तो मैं भी एक समारोह है कि के लिए एक कार्यक्रम इस तरह शायद कुछ एक को कम से कम राज्य में अजगर के साथ खोला जा करने की अनुमति होगी के लिए समझौता होगा:

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 सर्वर नहीं है।

कोई विचार?

उत्तर

6

आप 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." 
+0

क्या आपको लिनक्स पर संबंधित मॉड्यूल पता है? – helplessKirk

0

यदि कोई दिखाई दे रहा है तो टर्मिनल है, प्रक्रिया के stdout को पुनर्निर्देशित करें।

+0

यह एक टर्मिनल नहीं है। – wtz

1

उद्देश्य क्या है?

यदि आप पृष्ठभूमि में काम कर रहे एक छिपी हुई (कोई खिड़की) प्रक्रिया नहीं चाहते हैं, तो विंडोज़ सेवा लिखना और सामान्य विंडो सेवा तंत्र का उपयोग करके इसे शुरू/बंद करना सबसे अच्छा तरीका होगा। विंडोज सेवा आसानी से पायथन में लिखा जा सकता है उदा। यहाँ मेरी अपनी सेवा के भाग (यह कुछ संशोधनों के बिना नहीं चलेगा)

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 
+1

मुझे लगता है कि यह मेरी इच्छा के अनुसार शीर्ष पर है। स्क्रिप्ट का उद्देश्य केवल स्क्रिप्ट प्रारंभ करते समय एक प्रोग्राम छिपाना (कोई खिड़की) चलाने के लिए है। जिस प्रोग्राम को मैं छिपाना चाहता हूं वह एक स्वामित्व वाला एप्लिकेशन है जो कुछ संख्या क्रंचिंग करता है और लिखा जाता है। सी। पायथन मूल रूप से इसे छुपाता है और मैंने लिखा है कि एक बहुत ही सरल पारदर्शी जीयूआई विंडो में प्रगति लाती है। कोई बड़ी बात नहीं। समस्या यह है कि मैं नहीं चाहता कि यह विशाल खिड़की मेरे डेस्कटॉप के चारों ओर तैर रही हो, इसलिए मैं इसे छिपाना चाहता हूं। – wtz

+0

@wtzolt, यह निर्भर करता है, लेकिन लंबे समय तक चलने वाली पृष्ठभूमि प्रक्रिया सेवा सबसे अच्छा तरीका है, फिर भी मैंने किसी भी प्रकार की विंडो को छिपाने के लिए एक और समाधान जोड़ा है, इसलिए इसे आपके ऐप के साथ भी काम करना चाहिए –

+0

@wtz शायद यह थोड़ा ऑफटॉप है लेकिन वहां "पावर मेनू" नामक एक साफ छोटा सा उपकरण है http://www.abstractpath.com/powermenu/ यह विंडोज़ के लिए एक प्रमुख * ix डेस्कटॉप की कुछ विशेषताएं लाता है। ट्रे को कम करें या हमेशा शीर्ष पर जाएं – enthus1ast

10

यह आसान है :)
अजगर popen STARTUPINFO संरचना स्वीकार करें ...
STARTUPINFO संरचना के बारे में: https://msdn.microsoft.com/en-us/library/windows/desktop/ms686331(v=vs.85).aspx

भागो छिपे हुए:

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() 
संबंधित मुद्दे