2013-08-21 28 views
7

Ho uno script python 'b.py' che stampa il tempo ininterrottamente in 5 sec.Come posso chiamare uno script python da uno script python

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

E nella mia a.py, mi chiamano b.py da:

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 

e più tardi, Io uccido 'b.py' da: 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") 

Ho 2 domande. 1. perché non vedo alcuna impronta da "b.py" e quando faccio "ps -efW" non vedo un processo chiamato "b.py"? 2. Perché quando uccido un processo come sopra, vedo "l'autorizzazione rifiutata"?

Sto eseguendo lo script sopra cygwin sotto Windows.

Grazie.

+6

Inception python – Nick

+1

un modo più semplice per uccidere 'b.py' è restituire' p' da 'run_b()' prima di iniziare a leggere l'output di 'b.py' e chiamare' p.kill(); p.wait() 'più tardi. – jfs

+0

controlla che './B.py' sia avviato con successo (' p.poll() 'dovrebbe essere' None') – jfs

risposta

1
  1. Perché non vedo nessuna impronta fuori da 'b.py' e quando lo faccio 'ps -efW' Non vedo un processo chiamato 'b.py'?

    Change run_b() linee:

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

    non si vedrà un processo denominato "b.py", ma qualcosa come "python b.py", che è po 'diverso. Dovresti usare pid al posto del nome per trovarlo (nel tuo codice "p.pid" ha il pid).

  2. Perché quando uccido un processo come sopra, vedo "l'autorizzazione rifiutata"?

    os.kill è supportato in Windows solo 2.7+ e funziona un po 'diverso rispetto alla versione di posix. Tuttavia puoi usare "p.pid". Il modo migliore per uccidere un processo in modo multi-piattaforma è:

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

killpg funziona anche su altri sistemi operativi Unixy OS X e.

+0

Per eseguire un altro script Python da quello corrente, 'cmd' dovrebbe essere' sys.executable' e avrebbe anche bisogno di avere il nome dello script, '" ./b.py "', passato come argomento. – martineau

Problemi correlati