Comment lancer un nouveau processus indépendant en Python

j'ai un code Python qui a parfois besoin de couvrir un nouveau processus pour exécuter un script shell de manière "fire and forget", c'est-à-dire sans bloquer. Le script shell ne communiquera pas avec le code Python original et mettra probablement fin au processus d'appel de Python, de sorte que le script shell lancé ne peut pas être un processus enfant du processus d'appel de Python. J'ai besoin d'être lancé comme un processus indépendant.

En d'autres termes, disons que j'ai mycode.py et que lancements script.sh. Puis mycode.py continuera le traitement sans blocage. Le scénario script.sh va faire certaines choses indépendamment et va ensuite réellement s'arrêter et redémarrer mycode.py. Donc le processus qui court script.py doit être totalement indépendant de mycode.py. Comment je peux faire ça? Je pense que les sous-processus.Popen ne bloquera pas, mais créera tout de même un processus enfant qui se termine dès que mycode.py arrête, ce n'est pas ce que je veux.

17
demandé sur Peter Mortensen 2013-12-18 03:07:29

2 réponses

Essayez ajoutant " nohup " à script.sh. Vous aurez probablement besoin de décider ce qu'il faut faire avec stdout et stderr; je le laisse tomber 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)
16
répondu Lasse 2018-06-03 16:30:10

il suffit d'utiliser le sous-processus.Popen. Les travaux suivants OK 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 - pas essayé 3.3 - il vient de la nécessité de supprimer le logiciel de test expiré sur la machine des clients.

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])
2
répondu Steve Barnes 2018-06-03 16:32:29