2013-12-17 7 views
13

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

दूसरे शब्दों में, मान लें कि मेरे पास mycode.py है और यह script.sh लॉन्च करता है। फिर mycode.py अवरुद्ध किए बिना प्रसंस्करण जारी रहेगा। स्क्रिप्ट script.sh कुछ चीजें स्वतंत्र रूप से करेगी, और फिर वास्तव में रोकेंगी और mycode.py को पुनरारंभ करेंगे। तो script.py चलाने वाली प्रक्रिया mycode.py से पूरी तरह से स्वतंत्र होना चाहिए। मैं यह कैसे कर सकता हूं? मुझे लगता है कि subprocess.Popen ब्लॉक नहीं करेगा, लेकिन अभी भी एक बाल प्रक्रिया तैयार करेगी जो जल्द ही mycode.py स्टॉप हो जाती है, जो मैं नहीं चाहता हूं।

+0

कोशिश [अजगर-डेमॉन] (https://pypi.python.org/pypi/python-daemon/) – JBernardo

उत्तर

13

script.sh http://en.wikipedia.org/wiki/Nohup पर "नोहुप" तैयार करने का प्रयास करें। आपको शायद यह तय करने की आवश्यकता होगी कि स्टडआउट और स्टडर के साथ क्या करना है, मैं इसे उदाहरण में छोड़ देता हूं।

import os 
from subprocess import Popen 

devnull = open(os.devnull, 'wb') # use this in python < 3.3 
# python >= 3.3 has subprocess.DEVNULL 
Popen(['nohup', 'script.sh'], stdout=devnull, stderr=devnull) 
+0

यह काम करने के लिए लगता है - धन्यवाद! – Marc

+0

अजीब, मुझे – boh

+0

पर काम करने के लिए कमांड एंड पर एक '& 'की आवश्यकता है, आप इस के माध्यम से तर्क कैसे पारित करते हैं? – AngryPanda

1

बस subprocess.Popen का उपयोग करें। निम्नलिखित विंडोज़ XP & 7 और पायथन 2.5.4, 2.6.6 और 2.7.4 पर मेरे लिए ठीक काम करता है और py2exe के साथ परिवर्तित होने के बाद - 3.3 - की कोशिश नहीं की गई है, यह क्लाइंट मशीन पर समाप्त हो चुके परीक्षण सॉफ़्टवेयर को हटाने की आवश्यकता से आता है

import os 
import subprocess 
import sys 
from tempfile import gettempdir 

def ExitAndDestroy(ProgPath): 
    """ Exit and destroy """ 
    absp = os.path.abspath(ProgPath) 
    fn = os.path.join(gettempdir(), 'SelfDestruct.bat') 
    script_lines = [ 
     '@rem Self Destruct Script', 
     '@echo ERROR - Attempting to run expired test only software', 
     '@pause', 
     '@del /F /Q %s' % (absp), 
     '@echo Deleted Offending File!', 
     '@del /F /Q %s\n' % (fn), 
     #'@exit\n', 
     ] 
    bf = open(fn, 'wt') 
    bf.write('\n'.join(script_lines)) 
    bf.flush() 
    bf.close() 
    p = subprocess.Popen([fn], shell=False) 
    sys.exit(-1) 

if __name__ == "__main__": 
    ExitAndDestroy(sys.argv[0])