Exécuter le processus et ne pas attendre

Je voudrais lancer un processus et ne pas attendre son retour. J’ai essayé de spawn avec P_NOWAIT et sous-processus comme ceci:

app = "C:\Windows\Notepad.exe" file = "C:\Path\To\File.txt" pid = subprocess.Popen([app, file], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE).pid 

Cependant, la fenêtre de la console rest affichée jusqu’à la fermeture du Bloc-notes. Est-il possible de lancer le processus sans attendre qu’il se termine?

Cet appel n’attend pas la fin du processus fils (sous Linux). Ne me demandez pas ce close_fds fait close_fds ; J’ai écrit le code il y a quelques années. (BTW: La documentation de subprocess.Popensubprocess.Popen est déroutant, à mon humble avis.)

 proc = Popen([cmd_str], shell=True, stdin=None, stdout=None, stderr=None, close_fds=True) 

Modifier:

J’ai regardé la documentation du sous – processus , et je crois que l’aspect important pour vous est stdin=None, stdout=None, stderr=None, . Sinon, Popen capture la sortie du programme et vous êtes censé l’examiner. close_fds rend les fichiers du processus parent inaccessibles pour l’enfant.

J’ai finalement réussi à faire ça. Je cours “Python 2.6.6 (r266: 84297, 24 août 2010, 18:13:38) [MSC v.1500 64 bit (AMD64)] win32”. Voici comment je devais le coder:

 from subprocess import Popen DETACHED_PROCESS = 0x00000008 cmd = [ sys.executable, 'c:\somepath\someprogram.exe', parm1, parm2, parm3 ] p = Popen(cmd,shell=False,stdin=None,stdout=None,stderr=None,close_fds=True,creationflags=DETACHED_PROCESS) 

Cela désactive toute la tuyauterie d’entrée / sortie standard et n’exécute PAS le programme appelé dans le shell. La définition de ‘creationflags’ sur DETACHED_PROCESS semblait faire l’affaire. J’oublie où je l’ai découvert, mais un exemple est utilisé ici .

Je pense que la manière la plus simple d’implémenter cela est d’utiliser la famille de fonctions os.spawn * qui passe le drapeau P_NOWAIT .

Ceci, par exemple, engendrera un processus cp pour copier un fichier volumineux dans un nouveau répertoire et ne pas se soucier de l’attendre.

 import os os.spawnlp(os.P_NOWAIT, 'cp', 'cp', '/path/large-file.db', '/path/dest') 

Vous capturez les entrées et les sorties du programme pour que votre programme ne se termine pas tant qu’il ouvre les descripteurs de fichiers. Si vous souhaitez capturer, vous devez fermer les descripteurs de fichiers. Si vous ne voulez pas capturer:

 app = "C:\Windows\Notepad.exe" file = "C:\Path\To\File.txt" pid = subprocess.Popen([app, file]).pid