2013-08-21 8 views
7

J'ai un script python 'b.py' qui imprime le temps de 5 secondes.Comment puis-je appeler un script python à partir d'un script python

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

Et dans mon a.py, j'appelle b.py par:

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 

et plus tard, je tue 'b.py' par: 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") 

J'ai 2 questions. 1. Pourquoi je ne vois aucune impression depuis 'b.py' et quand je fais 'ps -efW' je ne vois pas de processus nommé 'b.py'? 2. Pourquoi quand je tue un processus comme ci-dessus, je vois 'autorisation refusée'? Je cours au-dessus du script sur cynwin sous Windows.

Merci.

+6

Création d'un python – Nick

+1

un moyen plus facile de tuer 'b.py' est de retourner' p' de 'run_b()' avant de commencer à lire la sortie de 'b.py' et d'appeler' p.kill(); p.wait() 'plus tard. – jfs

+0

vérifiez que './B.py' est démarré avec succès (' p.poll() 'devrait être' None') – jfs

Répondre

1
  1. Pourquoi je ne vois pas de imprime de « b.py » et quand je fais « ps -efW » Je ne vois pas un processus nommé « b.py »?

    Change run_b() lignes:

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

    Vous ne verrez un processus nommé "b.py", mais quelque chose comme "b.py python" qui est un peu différent. Vous devriez utiliser pid au lieu du nom pour le trouver (dans votre code "p.pid" a le pid). Pourquoi quand je tue un processus comme ci-dessus, je vois 'autorisation refusée'? Os.kill est supporté sous Windows seulement 2.7+ et agit un peu différemment de la version posix. Cependant, vous pouvez utiliser "p.pid". La meilleure façon de tuer un processus d'une manière multi-plateforme est:

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

killpg travaille également sur OS X et d'autres systèmes d'exploitation unixy.

+0

Pour exécuter un autre script Python à partir de l'actuel, 'cmd' devrait être' sys.executable' et il devrait aussi avoir le nom du script, "" ./b.py "', passé en argument. – martineau

Questions connexes