2010-01-21 17 views
8

मैं एक पायथन प्रोग्राम लिख रहा हूं कि, यदि उपयोगकर्ता इसे चलाने के दौरान सेटिंग्स बदलता है, तो बदली गई सेटिंग्स को लागू करने के लिए पुनरारंभ करने की आवश्यकता है। क्या इसे करने का कोई तरीका है? मैं कुछ सोच रहा हूँ की तर्ज पर:एक पायथन प्रोग्राम को पुनरारंभ करें

import sys 
command_line = ' '.join(sys.argv) 
# Now do something with command_line 
# Now call my custom exit procedure 

नोट: मैं विंडोज पर हूँ, कि अगर एक फर्क

+0

यूनिक्स पृष्ठभूमि प्रक्रियाओं पर आमतौर पर सिग्नल हैंडलर का उपयोग करें, पायथन में सिग्नल मॉड्यूल देखें। आप संभवतः विंडोज – Anycorn

+0

से संबंधित कर सकते हैं: [क्या स्क्रिप्ट के भीतर पायथन-ओ (ऑप्टिमाइज़) ध्वज सेट करना संभव है?] (http://stackoverflow.com/q/7527055/4279) – jfs

उत्तर

8

मैं सभी गुस्से आप फिर से करने की कोशिश कर से प्राप्त होने की संभावना हो बाईपास होगा बनाता है अपने आप को छोड़ दो और इसे पर्यावरण के हाथों में छोड़ दें।

कि करके, मेरा मतलब है:

  1. एक नियंत्रित प्रोग्राम है जो एक से अधिक अपने कार्यक्रम एक पाश में (एक ही मानकों यह दिया गया था) के साथ चलाने जबकि अपने कार्यक्रम के लिए एक विशिष्ट "पुनः आरंभ के साथ बाहर निकल जाता है कुछ नहीं करता है "कोड। यह cmd फ़ाइल के रूप में सरल हो सकता है या एक अन्य (बहुत सरल) पायथन प्रोग्राम के रूप में जटिल हो सकता है जो os.system का उपयोग करता है)। असल में, जब तक कि नियंत्रण प्रोग्राम कोड को "पुनरारंभ" प्राप्त करता है, यह आपके प्रोग्राम को बिल्कुल उसी पैरामीटर के साथ फिर से चलाएगा। कोई अन्य कोड इसे उस कोड से बाहर निकलने का कारण बनता है।

  2. जब आप पूरी तरह से बाहर निकलना चाहते हैं, तो अपने वास्तविक पायथन प्रोग्राम को वापसी कोड 0 (या कुछ भी जो त्रुटि स्थिति में "पुनरारंभ" कोड नहीं है) के साथ बाहर निकलें।

  3. यदि आप बस अपने प्रोग्राम के दूसरे पुनरावृत्ति (उदाहरण के लिए कॉन्फ़िगर को दोबारा पढ़ने के लिए) चक्र करना चाहते हैं, तो नियंत्रण प्रोग्राम द्वारा मान्यता प्राप्त "पुनरारंभ" कोड से बाहर निकलें।

लेकिन आप अपने आवेदन को फिर से इंजीनियरिंग के बारे में भी सोचना चाहेंगे ताकि वह किसी भी समय अपनी कॉन्फ़िगरेशन को फिर से पढ़ सके। इससे पूरी समस्या दूर हो जाएगी। आप उल्लेख नहीं करते कि यह एक विकल्प क्यों नहीं है इसलिए मुझे लगता है कि आपके पास कुछ कारण है कि यह क्यों काम नहीं करेगा।

लेकिन, यदि आप नहीं करते हैं, तो वह रास्ता है जिसे मैं चुन रहा हूं।

पहला विकल्प के लिए कुछ नमूना कोड प्रदान करने के लिए (यह विंडोज पर है, लेकिन Cygwin के तहत - एक ही बुनियादी नियमों विंडोज देशी अजगर के लिए आवेदन करना चाहिए लेकिन आप os.system से वापसी मान की जाँच करनी चाहिए) .:

> cat phase1.py 
#!/usr/bin/python 
import os 
status = 9 
while status == 9: 
    status = int(os.system ("./phase2.py")/256) # exit code is upper 8 bits 
    print "Controller: %d"%(status) 

 

> cat phase2.py 
#!/usr/bin/python 
import sys 
import time 
time.sleep(1) 
val = int(time.time())%10 
if val == 0: 
    rc = 0 
else: 
    rc = 9 
print "Program: %d -> %d"%(val,rc) 
sys.exit(rc) 

 

> ./phase1.py 
Program: 2 -> 9 
Controller: 9 
Program: 3 -> 9 
Controller: 9 
Program: 4 -> 9 
Controller: 9 
Program: 5 -> 9 
Controller: 9 
Program: 7 -> 9 
Controller: 9 
Program: 8 -> 9 
Controller: 9 
Program: 9 -> 9 
Controller: 9 
Program: 0 -> 0 
Controller: 0 

आप प्रोग्राम को फिर से चलाने के लिए यह तय करने के लिए 9 के निकास कोड का उपयोग कर नियंत्रक को देख सकते हैं। कार्यक्रम स्वयं एक गूंगा है जो 9 लौटाता है जब तक कि यह 10-सेकंड एकाधिक पर न हो।

5

यूनिक्स पर, आप कार्यों की os.execl परिवार उपयोग कर सकते हैं:

इन कार्यों सब एक नए कार्यक्रम पर अमल, मौजूदा प्रक्रिया की जगह; वे वापस नहीं आते हैं। यूनिक्स पर, नया निष्पादन योग्य वर्तमान प्रक्रिया में लोड किया गया है, और कॉलर के समान प्रक्रिया आईडी होगी। OSError अपवादों के रूप में त्रुटियों की सूचना दी जाएगी।

विंडोज़ पर, os.spawnl परिवार पर एक नज़र डालें, जो यूनिक्स कॉल से कम कुशल हैं।

+0

'os.execl() 'विंडोज़ पर भी काम करता है। – jfs

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