2017-05-11 5 views
1

Ich schrieb ein Python-Skript, um mehrere NS-3-Simulationen mit unterschiedlichen Seeds und verschiedenen Knotenzahlen zu laufen. Mein Skript ruft ./waf --run=<scenario_name> auf, führt dann 10 Seeds aus, ändert die Anzahl der Knoten und führt 10 weitere Seeds aus und so weiter.run Python-Skript im Hintergrund

Das Problem ist, dass ich nach dem Aufruf meines Skripts den Benutzer für eine Eingabe (welches Szenario ausgeführt werden soll). Wegen dieser raw_input Anruf konnte ich nohup myScript.py & nicht verwenden. Ich versuchte auch CTRL + Z, bg und disown. Aber das hat auch nicht funktioniert.

Hier ist mein Skript:

#!/usr/bin/python 

import subprocess 
from pathlib import Path 
import glob 

scenario = raw_input("Type scenario (foo or bar): ") 
if scenario == 'foo': 
    wafString = './waf --run "scratch/test-foo --nodeCount=' 

elif scenario == 'bar': 
    wafString = './waf --run "scratch/test-bar --nodeCount=' 

else: 
    print ("Wrong input!") 

ns3Global = 'NS_GLOBAL_VALUE="RngRun='  
numbers = [25, 50, 100] # number of nodes 

for nodeCount in numbers: 
    for rngRun in range(1,11): 
     myArgument = ns3Global + str(rngRun) + '" ' + wafString + str(nodeCount) + '" ' 

     print "*** Running experiment with " + str(nodeCount) + \ 
      " nodes and random seed " + str(rngRun) + "\n" 
     subprocess.call(myArgument, shell=True) 

Jede Hilfe wird sehr geschätzt.

+1

Warum nicht 2 Skripte schreiben? Das erste Skript fragt den Benutzer nach der Eingabe und startet dann das zweite Skript (mit dem Szenario-Parameter) im Hintergrund und beendet sich selbst. –

Antwort

0

Verwenden subprocess.Popen(... statt subprocess.call(

p = subprocess.Popen(myArgument) 

Vermeiden Sie verwenden shell=True wenn ns3Global brauchen es nicht.

Python 3.6 »Dokumentation»17.5. subprocess — Subprocess
ein Kind-Programm in einem neuen Prozess ausführen.

+0

Ich habe getan, was die Anweisungen über die Verwendung von 'Popen' und das Parsing des Befehls als eine Liste sagten, aber bekam ein' [Errno 2] Keine solche Datei oder Verzeichnis ' – John

+0

Haben Sie die ** Anmerkung über shlex.split() beobachtet ** sehen Sie unten auf der verlinkten Seite? – stovfl

+0

Ja. Ich benutze 'args = shlex.split (myArgument)' und dann 'p = subprocess.Popen (args)' – John