2017-03-28 1 views
0

J'essaye d'écrire un programme simple pour appeler un manuscrit de coquille. J'ai besoin que le script shell soit exécuté en continu, cependant, pas dans un intervalle de temps donné, car je ne peux pas savoir exactement combien de temps cela prendra pour que le processus créé par le script shell finisse. Actuellement, j'ai utilisé le threading pour exécuter le script toutes les N secondes. Ce dont j'ai besoin est, dès que "test.sh" se termine, exécutez "test.sh" à nouveau.Python, lance un script shell dès la fin de l'itération précédente.

Ceci est mon code actuel.

import subprocess 
import threading 

looptime = 7.0 

def recognize(): 
    threading.Timer(looptime,recognize).start() 
    filepath = "/home/user/Downloads/image.jpg" 

    output = subprocess.check_output(['dir/test.sh',str(filepath)]) 
    print ("python print\n%s" % output) 

recognize() 

Répondre

2

Vous n'avez pas besoin de threading.Timer. subprocess.check_output bloquera le processus principal jusqu'à la fin du processus fils.

import subprocess 

def recognize(): 
    filepath = "/home/user/Downloads/image.jpg" 

    output = subprocess.check_output(['dir/test.sh',str(filepath)]) 
    print ("python print\n%s" % output) 

while True: 
    recognize() 
+0

Donc, en supprimant le timer, il lancera test.sh dès que test.sh sera terminé? Est-ce vraiment aussi simple? –

+0

@GeorgeT. Oui, ça l'est. – gzc

0

Exemple pour un script bash qui exécutera en boucle sans fin le script test.sh, par exemple:

while

#!/bin/bash 
while : 
do 
    echo "running script" 
    ./test.sh 
done 

boucle

#!/bin/bash 
for ((; ;)) 
do 
    echo "running script" 
    ./test.sh 
done 
+0

Comment est-ce que je pourrais retourner la sortie au programme python en utilisant cette méthode? Il est nécessaire plus bas dans le programme, pas simplement pour une impression. –

0

Vous pouvez utiliser subprocess.check_call(cmd_line)

Il se bloque jusqu'à la fin du sous-processus.

Une fois que check_call() est de retour, vous pouvez lancer une nouvelle instance immédiatement.

+0

Je devrais regarder dans ceci, car je ne suis pas au courant de cmd_line. En utilisant cela, je pourrais définir l'intervalle à 1 seconde et dès que le processus se termine, il fonctionnerait à nouveau à la seconde suivante? –

+0

Même principe que check_output, cmd_line ce que cette fonction reçoit en entrée - un tableau de chaînes – egur