2013-10-30 3 views
8

Ich brauche nur einen Hinweis, wie Sie die Dinge richtig machen.subprocess.Popen: wie eine Liste als Argument übergeben

Angenommen, ich habe ein Skript namens script.py, das eine Liste von Namen als Argument ["name1", "name2" usw.] verwendet.

Ich möchte dieses Skript von einem anderen Skript mit dem Subprozessmodul aufrufen. Also, was ich tun möchte ist folgendes:

myList = ["name1", "name2", "name3"] 
subprocess.Popen(["python", "script.py", myList]) 

Natürlich ist das nicht funktioniert, weil die subprocess.Popen Methode eine Liste von Strings als Argumente erfordert. So hielt ich folgendes tun:

subprocess.Popen(["python", "script.py", str(myList)]) 

nun der Prozess beginnt, aber es funktioniert nicht, weil es eine Zeichenfolge als Argument hat und keine Liste. Wie sollte ich das richtig beheben?

Antwort

19

Verketten Sie sie mit + Operator.

myList = ["name1", "name2", "name3"] 
subprocess.Popen(["python", "script.py"] + myList) 

BTW, wenn Sie gleiche Python-Programm verwenden möchten, ersetzen "python" mit sys.executable.

+0

oder '.extend()' es, wenn Sie nicht sicher über den Typ der zusätzlichen Argumente sind. –

+0

@NiklasR oder '+ list (myList)' – falsetru

+1

'extendieren' ist nur nützlich, wenn Sie eine benannte Liste vor dem Aufruf ändern. 'subprocess.Popen ([" python "," script.py "]. extend (myList))' würde 'None' (der Rückgabewert von' extend') als erstes und einziges Argument an 'Popen()' übergeben. – chepner

1

Danke für die schnelle Antwort falsetru. Es funktioniert nicht direkt, aber ich verstehe, wie es geht. Du bist Vorschlag äquivalent zu tun:

subprocess.Popen(["Python","script.py","name1","name2","name3"]) 

Wo ich drei Argumente, die die Saiten in meiner ursprünglichen Liste enthalten sind.

Alles, was ich in meiner script.py Datei tun muß, ist eine neue Liste von jedem Argumente, indem Sie den folgenden erhalten zu bauen:

myList = sys.argv[1:] 

myList ist jetzt das gleiche, als die, die ich hatte anfangs!

["name1","name2","name3"] 

Ich weiß nicht, warum ich nicht früher darüber nachgedacht habe!