2012-07-04 12 views
14

मेरे पास एक पाइथन-आधारित जीटीके एप्लिकेशन है जो कई मॉड्यूल लोड करता है। यह बहुत की तरह (लिनक्स) टर्मिनल से चलाया जाता है:अपने आप से पाइथन-स्क्रिप्ट को पुनरारंभ करें

./myscript.py --some-flag setting

कार्यक्रम उपयोगकर्ता डाउनलोड कर सकते हैं (Git का उपयोग) नए संस्करण के भीतर से। यदि ऐसा मौजूद है/डाउनलोड किया गया है, तो एक बटन दिखाई देता है कि मैं इस कार्यक्रम को नए संकलित सामग्री (निर्भरता/आयात सहित) के साथ पुनरारंभ करना चाहता हूं। अधिमानतः यह सभी झंडे को रखने के लिए sys.argv की सामग्री का उपयोग करके इसे पुनरारंभ भी करेगा।

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

अधिमानतः समाधान विंडोज और मैक के लिए भी काम करना चाहिए लेकिन यह आवश्यक नहीं है।

+0

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

+0

संभावित डुप्लिकेट [एक स्व-अद्यतन पायथन स्क्रिप्ट को पुनरारंभ करना] (http://stackoverflow.com/questions/1750757/restarting-a-self-updating-python-script) –

उत्तर

24

आप os.exec*() देख रहे हैं।

+0

वाह! मुझे नहीं पता था कि यह संभव है। यह बात बताने के लिए धन्यवाद! –

+2

यह मुझे अजगर 2.7.9 के साथ एक अवैध वाक्यविन्यास त्रुटि देता है। – clankill3r

2

अद्यतन - भविष्य में संदर्भ के लिए कुछ उदाहरण से जवाब का

मैं runme.sh

#!/bin/bash 
kill -9 server.py 
python /home/sun/workspace/c/src/server.py & 

है और मैं server.py है जहां मैं आवेदन ही पुनः आरंभ करने की जरूरत है, तो मैं था:

os.system('runme.sh') 

लेकिन उसने runme.sh का पालन करके एप्लिकेशन को पुनरारंभ नहीं किया, इसलिए जब मैंने इस तरह से उपयोग किया:

os.execl('runme.sh', '') 

तो मैं खुद

14

पुनः आरंभ करने की मुझे लगता है कि यह एक अधिक विस्तृत जवाब है, के रूप में कभी कभी तुम भी कई फ़ाइल खोलने वस्तुओं और वर्णनकर्ता के साथ खत्म हो सकता है कर रहा था, कि स्मृति मुद्दों या के समवर्ती कनेक्शन पैदा कर सकता है एक नेटवर्क डिवाइस।

import os 
import sys 
import psutil 
import logging 

def restart_program(): 
    """Restarts the current program, with file objects and descriptors 
     cleanup 
    """ 

    try: 
     p = psutil.Process(os.getpid()) 
     for handler in p.get_open_files() + p.connections(): 
      os.close(handler.fd) 
    except Exception, e: 
     logging.error(e) 

    python = sys.executable 
    os.execl(python, python, *sys.argv) 
0

मैं जानता हूँ कि इस समाधान तकनीकी रूप से नहीं है कि आप क्या कह रहे हैं, लेकिन आप 100% यकीन है कि आप सब कुछ मुक्त कर दिया या निर्भरता पर भरोसा करने के लिए आप सिर्फ एक से में स्क्रिप्ट चलाने सकता है नहीं करना चाहती होना चाहते हैं किसी अन्य रूप में पाश:

import os, time 

while 1: 
    os.system("python main.py") 
    print "Restarting..." 
    time.sleep(0.2) # 200ms to CTR+C twice 

तो फिर तुम बस main.py पुनः आरंभ कर सकते हैं:

quit() 
संबंधित मुद्दे