2010-05-04 19 views
1

J'ai un problème avec le sous-processus du module; Je cours un manuscrit de Python:Bloc de sous-processus Python

subprocess.Popen('./run_pythia.sh', shell=True).communicate() 

et quelquefois il bloque juste et il ne finit pas pour exécuter le manuscrit. Avant que j'utilisais .wait(), mais je switched to .communicate(). Néanmoins, le problème continue.

D'abord le script compile quelques fichiers, il exécute dans un fichier:

run_pythia.sh:

#!/bin/bash 
#PBS -l walltime=1:00:00 

./compile.sh 
./exec > resultado.txt 

compile.sh:

O=`find ./ -name "*.o" | xargs` 

# LOAD cernlib2005 
module load libs/cernlib/2005 

# Compile and Link 
FC=g77 
CERNLIBPATH="-L/software/local/cernlib/2005/lib -lpacklib" 

$FC call_pyth_mix.f analise_tt.f $O $CERNLIBPATH -o exec 
+1

Avez-vous besoin d'interagir avec le processus? Ou lisez-vous simplement la sortie? Vous devriez utiliser '.communicate()' car cela empêchera tout problème de blocage. Cependant, si vous avez besoin d'interagir avec le processus en écrivant à stdin et en lisant depuis stderr/stdout, c'est une toute nouvelle boule de cire. – dlamotte

Répondre

3

le script est que vous exécutez, est run_pythia.sh elle garantie terminer l'exécution? Sinon, vous ne voudrez peut-être pas utiliser des méthodes de blocage telles que communicate(). Vous voudrez peut-être envisager d'interagir avec les descripteurs de fichier .stdout, .stderr et .stdin du processus que vous avez traité vous-même (de manière non bloquante).

En outre, si vous souhaitez toujours utiliser communicate(), vous devez avoir passé l'objet subprocess.PIPE aux arguments constructeur de Popen.

Lisez le documentation sur le module pour plus de détails.

0

Peut-être que vous pouvez essayer de faire une trace sur elle:

import pdb; pdb.set_trace()