web-dev-qa-db-fra.com

Comment générer un nouveau processus indépendant dans Python

J'ai un code Python qui a parfois besoin de s'étendre sur un nouveau processus pour exécuter un script Shell de manière "tirer et oublier", c'est-à-dire sans blocage. Le script Shell ne communiquera pas avec l'original Python code et mettra probablement fin à l'appel Python processus, donc le script Shell lancé ne peut pas être un processus enfant de l'appel Python. J'ai besoin qu'il soit lancé en tant que processus indépendant.

En d'autres termes, disons que j'ai mycode.py et que lance script.sh. Ensuite, mycode.py continuera le traitement sans blocage. Le script script.sh fera certaines choses indépendamment, puis arrêtera et redémarrera réellement mycode.py. Le processus qui exécute script.py doit donc être complètement indépendant de mycode.py. Comment puis-je faire exactement cela? Je pense que subprocess.Popen ne bloquera pas, mais créera toujours un processus enfant qui se terminera dès que mycode.py s'arrêtera, ce qui n'est pas ce que je veux.

20
Marc

Essayez d'ajouter " Nohup " à script.sh. Vous devrez probablement décider quoi faire avec stdout et stderr; Je viens de le déposer dans l'exemple.

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)
18
Lasse

Utilisez simplement subprocess.Popen. Ce qui suit fonctionne bien pour moi sur Windows XP/Windows 7 et Python 2.5.4, 2.6.6 et 2.7.4. Et après avoir été converti avec py2exe - non essayé 3.3 - cela vient de la nécessité de supprimer le logiciel de test expiré sur la machine cliente.

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])
4
Steve Barnes