2013-08-21 6 views
7

Ich habe ein Python-Skript 'b.py', das die Zeit alle 5 Sekunden ausgibt.Wie kann ich ein Python-Skript aus einem Python-Skript aufrufen

while (1): 
    print "Start : %s" % time.ctime() 
    time.sleep(5) 
    print "End : %s" % time.ctime() 
    time.sleep(5) 

Und in meinem a.py, nenne ich b.py von:

def run_b(): 
     print "Calling run b" 
    try: 
     cmd = ["./b.py"] 

     p = subprocess.Popen(cmd, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.STDOUT) 

     for line in iter(p.stdout.readline, b''): 
         print (">>>" + line.rstrip()) 


    except OSError as e: 
     print >>sys.stderr, "fcs Execution failed:", e 

    return None 

und später, ich töten 'b.py' von: PS_PATH = „/ usr/bin/ps -efW "

def kill_b(program): 
    try: 

     cmd = shlex.split(PS_PATH) 

     retval = subprocess.check_output(cmd).rstrip() 
     for line in retval.splitlines(): 

      if program in line: 
       print "line =" + line 
       pid = line.split(None)[1] 
       os.kill(int(pid), signal.SIGKILL) 

    except OSError as e: 
     print >>sys.stderr, "kill_all Execution failed:", e 
    except subprocess.CalledProcessError as e: 
     print >>sys.stderr, "kill_all Execution failed:", e 

run_b() 
time.sleep(600) 
kill_b("b.py") 

Ich habe 2 Fragen. 1. Warum sehe ich keine Ausdrucke aus "b.py" und wenn ich "ps -efW" sehe, sehe ich keinen Prozess namens "b.py"? 2. Warum, wenn ich einen Prozess wie oben töte, sehe ich 'Erlaubnis abgelehnt'?

Ich laufe über Skript auf Cygwin unter Windows.

Vielen Dank.

+6

Inception python – Nick

+1

ein einfacherer Weg zu töten 'b.py' ist,' p' aus 'run_b()' zurückzugeben, bevor man 'b.py's Ausgabe liest und' p.kill(); p.wait() 'später. – jfs

+0

Überprüfen Sie, ob './B.py' erfolgreich gestartet wurde (' p.poll() 'sollte' None' sein) – jfs

Antwort

1
  1. Warum sehe ich keine Abzüge von ‚b.py‘ und wenn ich ‚ps -efW‘ I ‚b.py‘ genannt keinen Prozess sehen?

    ändern run_b() Linien:

    p = subprocess.Popen(cmd, 
            stdout=sys.stdout, 
            stderr=sys.stderr) 
    

    Sie werden nicht einen Prozess namens "b.py" aber so etwas wie "Python b.py" sehen, die etwas anders ist. Sie sollten pid anstelle von name verwenden, um es zu finden (in Ihrem Code "p.pid" hat die PID).

  2. Warum, wenn ich einen Prozess wie oben töte, sehe ich 'Erlaubnis abgelehnt'?

    os.kill wird unter Windows nur 2.7+ unterstützt und verhält sich ein wenig anders als die POSIX-Version. Sie können jedoch "p.pid" verwenden. Der beste Weg, einen Prozess in einer Cross-Plattform Art und Weise zu töten, ist:

    if platform.system() == "Windows": 
        subprocess.Popen("taskkill /F /T /PID %i" % p.pid, shell=True) 
    else: 
        os.killpg(p.pid, signal.SIGKILL) 
    

killpg Arbeiten auch auf OS X und anderen Unixy-Betriebssysteme.

+0

Um ein anderes Python-Skript aus dem aktuellen auszuführen, müsste 'cmd'' sys.executable' sein und es müsste auch der Skriptname, "./b.py", als Argument übergeben werden. – martineau

Verwandte Themen