2016-05-25 7 views
3

Ich habe derzeit eine Methode, die andere Python-Skripte mit Subprozessaufrufen ausführt. Ich habe mich gefragt, ob es überhaupt Zeit gibt, wie lange es dauert, bis das erledigt ist? Die Skripts werden in einem Intervall ausgeführt, was ich erreichen möchte, ist zu überprüfen, ob die Skripte innerhalb dieses Intervalls enden.Timing, wie lange es dauert, bis Subprozess abgeschlossen ist

def execute_scripts(script_name): 
    process = sp.Popen(['python2.7', script_name]) 
    print 'executing - ' + script_name 
+0

verwandten: [Python subprocess mit/usr/bin/Zeit: Wie erfassen Info Timing aber ignorieren alle anderen Ausgabe?] (http://stackoverflow.com/q/28520489/4279) – jfs

+0

@DorkMonStuh sind irgendwelche dieser Antworten akzeptabel? – hhbilly

+0

Hallo, Dies scheint ein blockierender Aufruf zu sein, ist es möglich, non blocking und Zeit, wie lange das Skript dauert zu haben? – DorkMonstuh

Antwort

0

Benötigen Sie das Programm, um weiter zu laufen, während die Skripte ausgeführt werden? Wenn nicht, können Sie die Programmausführung, bis der Prozess abgeschlossen blockieren und berichten über die Zeit dauerte es:

def execute_scripts(script_name): 
    time_start = time.time() 
    print "starting process" 
    process = sp.call(['python2.7', script_name]) 
    print 'finished process %s in %s s" % (process, time.time() - start_time) 
1

Verwenden timeit die Ausführung von kleinen Stückchen des Codes zu Zeit.

#sleep2.py 
import time 
time.sleep(2) 

Sie müssen subprocess.call verwenden zu blockieren, bis der Anruf beendet ist.

import timeit 
import subprocess as sp 

def execute_scripts(script_name): 
    process = sp.call(['python2.7', script_name]) 
    print 'executing - ' + script_name 

t = timeit.Timer("execute_scripts('sleep2.py')", setup="from __main__ import execute_scripts") 


print 'time taken : %f seconds' % t.timeit(1) 


executing - sleep2.py 
time taken : 2.032273 seconds 

Alternativ können Sie dieses durch das Schreiben eines Dekorateur zu Zeit Aufruf einer beliebigen Funktion verallgemeinern kann

import time 
import subprocess as sp 

def timed_execution(function): 
    def wrapper(arg): 
     t1 = time.time() 
     function(arg) 
     t2 = time.time() 
     return 'time taken : %f seconds' % (t2 - t1) + "\n" 
    return wrapper 


@timed_execution 
def execute_scripts(script_name): 
    sp.call(['python2.7', script_name]) 
    print 'executing - ' + script_name 


print execute_scripts('sleep2.py') 

executing - sleep2.py 
time taken : 2.025291 seconds