2009-11-17 7 views
30

मैंने एक स्क्रिप्ट लिखी है जो एक वेबसाइट से नवीनतम संस्करण डाउनलोड करके और चल रही स्क्रिप्ट को ओवरराइट करके स्वयं को अद्यतित रखेगी।एक स्व-अद्यतन पाइथन स्क्रिप्ट को पुनरारंभ करना

मुझे यकीन नहीं है कि इसे अद्यतन होने के बाद स्क्रिप्ट को पुनरारंभ करने का सबसे अच्छा तरीका क्या है।

कोई भी विचार?

मैं वास्तव में एक अलग अद्यतन स्क्रिप्ट नहीं चाहता हूं। ओह और इसे लिनक्स/विंडोज दोनों पर भी काम करना है।

उत्तर

26

लिनक्स में, या यूनिक्स, os.execl और दोस्तों के किसी अन्य रूप में इस के लिए एक अच्छा विकल्प है - तुम सिर्फ फिर से कार्यकारी sys.executable समान पैरामीटर पिछली बार के साथ मार डाला गया था के साथ की जरूरत है (sys.argv, कम या ज्यादा) या इसके किसी भी संस्करण को अगर आपको अपने अगले अवतार को सूचित करने की आवश्यकता है कि यह वास्तव में पुनरारंभ होता है। विंडोज़ पर, os.spawnl (और दोस्तों) सबसे अच्छा है जो आप कर सकते हैं (हालांकि यह os.execl की तुलना में अधिक समय और मेमोरी लेता है और दोस्तों संक्रमण के दौरान होगा)।

+0

शायद स्क्रिप्ट आसान होने पर जाने का सबसे अच्छा तरीका है। –

+0

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

+23

भविष्य के संदर्भ के लिए एक-लाइनर: 'os.execl (sys.executable, * ([sys.executable] + sys.argv))' – Claudiu

1

पोकू टीम के पास उनके विकास सर्वर के लिए werkzueg के अंदर एक बहुत अच्छा रीलोडर है। कोड here (यह फ़ाइल के निचले भाग की ओर है) को चेक करें।

+0

वह लिंक अब मर चुका है। क्या कोई और है? – Glycerine

+0

ऐसा लगता है कि वे github में चले गए: [werkzeug/service.py] (https://github.com/mitsuhiko/werkzeug/blob/master/werkzeug/serving.py) – johnny

+0

धन्यवाद! लिंक अपडेट किया गया। –

2

सबसे साफ समाधान एक अलग अद्यतन स्क्रिप्ट है!

इसके अंदर अपना प्रोग्राम चलाएं, एक नया संस्करण उपलब्ध है (वापस निकलने पर) रिपोर्ट करें। यह आपके प्रोग्राम को अपने सभी डेटा, अद्यतन को लागू करने के लिए अद्यतनकर्ता को सहेजने की अनुमति देता है, और नया संस्करण चलाता है, जो तब सहेजे गए डेटा को लोड करता है और जारी रहता है। उपयोगकर्ता को यह पूरी तरह से पारदर्शी हो सकता है, क्योंकि वे केवल अद्यतन प्रोग्राम चलाते हैं जो वास्तविक प्रोग्राम चलाता है।

+0

फिर आप अद्यतन स्क्रिप्ट को अपडेट नहीं कर सकते हैं। – JDiMatteo

+0

आप अपडेट के लिए जांच करने के लिए अपने मुख्य कार्यक्रम का उपयोग कर सकते हैं। जब कोई नया अपडेट उपलब्ध होता है। एक नया 'update.py' डाउनलोड करें .... फिर इसे निष्पादित करें। 'update.py' तब पुराना उदाहरण बंद कर देगा और एक नया स्पॉन करेगा। – Harvey

1

आप मॉड्यूल को पुनः लोड करने के लिए reload(module) का उपयोग कर सकते हैं।

3

मुझे लगता है कि सबसे अच्छा समाधान कुछ इस तरह हो whould:

आपका सामान्य कार्यक्रम:

... 

# ... part that downloaded newest files and put it into the "newest" folder 

from subprocess import Popen 

Popen("/home/code/reloader.py", shell=True) # start reloader 

exit("exit for updating all files") 

अद्यतन स्क्रिप्ट: (जैसे: घर/कोड/reloader.py)

from shutil import copy2, rmtree 
from sys import exit 

# maybie you could do this automatic: 
copy2("/home/code/newest/file1.py", "/home/code/") # copy file 
copy2("/home/code/newest/file2.py", "/home/code/") 
copy2("/home/code/newest/file3.py", "/home/code/") 
... 

rmtree('/home/code/newest') # will delete the folder itself 

Popen("/home/code/program.py", shell=True) # go back to your program 

exit("exit to restart the true program") 

मुझे आशा है कि यह आपकी मदद करेगा।

15

चेरीपी परियोजना में कोड है जो स्वयं को पुनरारंभ करता है। यहाँ how they do it है:

args = sys.argv[:] 
    self.log('Re-spawning %s' % ' '.join(args)) 

    args.insert(0, sys.executable) 
    if sys.platform == 'win32': 
     args = ['"%s"' % arg for arg in args] 

    os.chdir(_startup_cwd) 
    os.execv(sys.executable, args) 

मैं अपने खुद के कोड में इस तकनीक का उपयोग किया है, और यह बहुत अच्छा काम करता है। (मैंने ऊपर की खिड़कियों पर तर्क-उद्धरण कदम करने के लिए परेशान नहीं किया था, लेकिन यदि संभवतः तर्कों में रिक्त स्थान या अन्य विशेष वर्ण हो सकते हैं तो यह संभवतः आवश्यक है।)

0

मुख्य फ़ाइल:

if __name__ == '__main__': 

if os.path.isfile('__config.py'): 
    print 'Development' 
    push.update_server() 
else: 
    e = update.check() 
    if not e: sys.exit() 

अद्यतन फ़ाइल:

मुख्य कार्यक्रम अद्यतन समारोह

1 कॉल) अद्यतन हैं:

def check(): 
    e = 1.....perform checks, if something needs updating, e=0; 
    if not e: 
     os.system("python main.pyw") 
    return e 

यहाँ तर्क है फ़ंक्शन को अपडेट करने की अपेक्षा अपडेट करने की आवश्यकता है एट्स और "मुख्य"

के नए उदाहरणों को कॉल करता है फिर "मुख्य" निकास का मूल उदाहरण।

2) अद्यतन समारोह अद्यतन करने के लिए, तो "मुख्य"

0

अतिरिक्त स्क्रिप्ट अजगर की 'मी "निम्नलिखित इस्तेमाल किया जा सकता (एलेक्स के उत्तर के आधार पर पैरामीटर के साथ कॉल का समर्थन करने के चलाने के लिए जारी है की जरूरत नहीं है, तो ; विंडोज संस्करण):

os.spawnl(os.P_WAIT, sys.executable, *([sys.executable] + 
    (sys.argv if __package__ is None else ["-m", __loader__.name] + sys.argv[1:]))) 
sys.exit()