Frage


p = subprocess.Popen(args = "myprog.exe" + " " +
                     str(input1) + " " +
                     str(input2) + " " +
                     str(input3) + " " +
                     strpoints, stdout = subprocess.PIPE)

in dem obigen Code, input1, input2 und input3 sind alle ganzen Zahlen, die in Strings konvertiert werden. die Variable „strpoints“ ist eine Liste von beliebiger Länge von Strings. input1 erzählt die Länge von strpoints myprog. natürlich, wenn ich versuche, den obigen Code auszuführen, erhalte ich folgende Fehlermeldung:

  

Typeerror: Kann nicht konvertieren 'Liste' Objekt auf str implizit

Wie gehe ich alle Elemente der strpoints myprog.exe? bin ich dazu verdammt, mit str (strpoints) und dann hat myprog.exe analysiert diese für Kommas, Apostrophe usw. zu tun? z. B.

  

`>>> x = [ 'a', 'b']

     

`>>> str (x)

     

"[ 'a', 'b']"

oder soll ich eine große Zeichenfolge im Voraus erstellen? z. B.

  

'>>> x = [' a‘, 'b']

     

'>>> stringify (x)

     

'a b'

Dabei würde stringify so etwas wie


def stringify(strlist):
    rlist = ""
    for i in strlist:
        rlist = rlist + i + " "
    return rlist

War es hilfreich?

Lösung

Versuchen Sie string.join mit:

p = subprocess.Popen(args = "myprog.exe" + " " +
                     str(input1) + " " +
                     str(input2) + " " +
                     str(input3) + " " +
                     " ".join(strpoints), stdout = subprocess.PIPE)

Andere Tipps

args kann eine Folge sein:

p = subprocess.Popen(args = ["myprog.exe"] + 
                            [str(x) for x in [input1,input2,input3]] + 
                            strpoints,stdout = subprocess.PIPE)

Das ist richtig, wenn Ihre Argumente Shell-Metazeichen enthalten z.B. '* Und Sie nicht wollen, dass sie als solche interpretiert werden.

Vermeiden Sie alle Argumente in einer Zeichenfolge verkettet die Zeichenfolge verwendet wird.

Es ist viel einfacher und besser und sicherer nur eine Folge (Liste oder Tupel) übergeben von Argumenten. Dies gilt besonders, wenn jedes Argument ein Leerzeichen enthält (die für Dateinamen durchaus üblich ist).

Jeder dachte, dass Sie diese Zeichenfolge in Anführungszeichen, falls einschließen möchten sie Räume eingebettet? So etwas wie:

if strpoints:
    finalargs = '"' + '" "'.join(strpoints) + '"'
else:
    finalargs = ""
p = subprocess.Popen(args = "myprog.exe" + " " +
                 str(input1) + " " +
                 str(input2) + " " +
                 str(input3) + " " +
                 finalargs, stdout = subprocess.PIPE)

Das macht Ihre Zeichenkette länger, sondern die Integrität der einzelnen Elemente in der Liste erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top