2011-05-25 1 views
1

Je suis un débutant en Python. J'ai récemment essayé d'utiliser le script Python pour appeler une console exe qui est un processus qui nécessite un long moment. Je vais permettre à l'exe d'être appelé autant de fois que le CPU peut le permettre. Et quand l'exe a fini son travail. Il devrait libérer le processeur à d'autres nouveaux travaux. Donc, je pense que j'ai besoin du mécanisme de contrôle de processus multiples.Le multitraitement python ne peut pas contrôler plusieurs exe de console longue durée?

Depuis le multi-traitement peut seulement appeler la fonction appelable python. Il ne peut pas appeler directement la console exe. J'ai enveloppé le subprocess.Popen (cmd) dans une fonction python. Cependant, après que je l'ai fait, j'ai trouvé cela avant multiprocessing.Process.start() est utilisé. L'exe a déjà commencé. Et le problème est avant qu'il ne finisse ce qu'il fait (besoin de temps long), il ne me rend pas le contrôle. Le programme est gelé pour attendre. Ce n'est pas ce que je veux.

Je signale les codes ci-dessous:

import sys 

import os 

import multiprocessing 

import subprocess 

def subprocessExe(cmd): 

     return subprocess.call(cmd, shell=False, stdout=subprocess.PIPE, \ 
           stderr=subprocess.PIPE,creationflags=0x08000000) 

if __name__ == '__main__': 

     p = multiprocessing.Process(target=self.subprocessExe(exeFileName)) 

     p.start() 

     print p, p.is_alive() 

Merci pour votre temps!

Répondre

2

Vous appelez subprocessExec lorsque vous créez l'objet multiprocessing.Process. Vous devriez plutôt faire ceci:

p = multiprocessing.Process(target=subprocessExec, args=(exeFileName,)) 

Ensuite, cela devrait fonctionner.

+0

J'ai essayé. Ça ne marche pas. Vous avez une erreur dans le propre module forking.py de Python. – Mua

+0

Ce que j'ai utilisé est exactement ce que vous avez écrit là-bas. Mais mon nom de fichier a un espace là-bas. parce qu'il a des arguments suivis. Donc, mon "cmd" est comme quelque chose "* .exe xyz". Il n'a aucun problème avec subprocess.Popen. Mais si je mets toute la chaîne "cmd" dans arg de multiprocessing.processing. Il signale l'erreur de "picklingerror" – Mua

+0

Essayé encore sans espace dans la chaîne cmd. Seulement un fichier exe. Il signale toujours cette erreur. J'utilise python 2.6. – Mua

1

Il existe un certain nombre de problèmes dans votre scénario de test. Les travaux suivants pour moi:

import multiprocessing, subprocess 

def subprocessExe(cmd): 
    subprocess.call([cmd], shell=False) 

p = multiprocessing.Process(target=subprocessExe, args=('/full/path/to/script.sh',)) 
p.start() 

OU

subprocess.call([cmd], shell=True) 
p = multiprocessing.Process(target=subprocessExe, args=('script.sh',)) 

OU

subprocess.Popen([cmd], shell=True, stdout=subprocess.PIPE, \ 
           stderr=subprocess.PIPE) 
+0

vous pouvez également ajouter 'p.daemon = True' avant p.start() –

Questions connexes