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.
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)
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])