2012-11-11 5 views
7

मैंने एक प्रोग्राम बनाया है जो स्थानीय सर्वर में एक वेब आर्किटेक्चर बनाता है, फिर स्थानीय ब्राउज़र पर HTML और php पृष्ठों को प्रदर्शित करने के लिए आवश्यक ब्राउज़र लोड करता है।os.system और subprocess कॉल के बीच का अंतर

os.system कॉल अजगर प्रक्रिया को मारता है, लेकिन अन्य प्रक्रियाओं को बंद नहीं करता है - उदाहरण के लिए, httpd.exe और mysqld.exe

subprocess कॉल httpd.exe और mysqld.exe कार्यक्रमों को मारता है, लेकिन अजगर कोड को चलाने के लिए जारी है, और कोई कोड subprocess कॉल के बाद निष्पादित करता है।

पायथन कोड निष्पादित होने के बाद मैं सभी आवश्यक प्रक्रियाओं को मारने या छिपाने के बारे में कैसे जाऊं?

मेरा कोड यहां है।

os.makedirs(dr + x + '/admin' + '/css') 
dobj = open(dr + x + '/admin' + '/css' + '/style.css', 'w') 
dobj.close() 
del dobj 
os.makedirs(dr + x + '/admin' + '/js') 
os.makedirs(dr + x + '/admin' + '/img') 
################################################################################ 
## THE OS SYSTEM CALLS CLOSE THE APP BUT OPEN THE PROCESSES 
## AND THE SUBPROCESS CALLS CLOSE BOTH PROCESSES AND LEAVES THE APP OPEN 
## CANT WIN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
os.makedirs(dr + x + '/admin' + '/conf') 
#os.system(r'C:\\xampp\\apache\\bin\\httpd.exe') 
#os.system(r'C:\\xampp\\mysql\\bin\\mysqld.exe') 
subprocess.Popen(['C:\\xampp\\apache\\bin\\httpd.exe'], shell=True, creationflags=subprocess.SW_HIDE) 
subprocess.Popen(['C:\\xampp\\mysql\\bin\\mysqld.exe'], shell=True, creationflags=subprocess.SW_HIDE) 
webbrowser.open('localhost/' + x) 
sys.exit() 
################################################################################ 


else: 
    backmaybe = raw_input('Already Exists... Try Again? (Y/N) ') 
if backmaybe == 'y': 
    start() 
else: 
    sys.exit() 
+1

'sys.exit()' के बाद httpd, mysqld की वांछित चल रही स्थिति क्या है? – jfs

+5

यदि आप httpd चाहते हैं, तो आपकी स्क्रिप्ट के बाद mysqld चलना जारी रखें; आप [DETACHED_PROCESS | का उपयोग कर सकते हैं CREATE_NEW_PROCESS_GROUP] (http://stackoverflow.com/a/13256908/4279) ध्वज। बीटीडब्ल्यू, आपको 'खोल = सही' की आवश्यकता नहीं है। – jfs

+0

httpd और mysqld की चलती स्थिति चुपचाप चलनी चाहिए, ive ने इसे बहुत उपयोगकर्ता के अनुकूल बनाया है, किसी भी अतिरिक्त विंडो की आवश्यकता नहीं है। –

उत्तर

3

os.system और subprocess.Popen के बीच अंतर यह है कि वास्तव में एक popen pipe खोलता है, और os.system ज्यादा subprocess.call की तरह एक subshell शुरू होता है,। विंडोज़ केवल * निक्स ऑपरेटिंग सिस्टम की कुछ पाइप/खोल सुविधाओं का आधा समर्थन करता है, लेकिन अंतर अभी भी मूल रूप से वही होना चाहिए। एक सबहेल आपको मानक इनपुट और पाइप की तरह किसी अन्य प्रक्रिया के आउटपुट के साथ संवाद करने की अनुमति नहीं देता है।

आप जो चाहते हैं वह सबप्रोसेस का उपयोग करना चाहते हैं, लेकिन फिर अपने आवेदन को समाप्त होने से पहले पाइप ऑब्जेक्ट पर मार() (from the docs) पर कॉल करें। यह आपको यह तय करने देगा कि आप प्रक्रिया को कब समाप्त करना चाहते हैं। आपको pipe.communicate() पर कॉल करके और पाइप की फ़ाइल हैंडल को बंद करके प्रक्रिया को जो भी करना है, उसे संतुष्ट करने की आवश्यकता हो सकती है।

संबंधित मुद्दे