Domanda


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

nel codice sopra, input1, input2 e input3 sono tutti numeri interi che vengono convertiti in stringhe. la variabile "punti" è un elenco di lunghezza arbitraria di stringhe. input1 dice a myprog la lunghezza dei punti. ovviamente, quando provo a eseguire il codice sopra, ricevo il seguente messaggio di errore:

  

TypeError: impossibile convertire l'oggetto 'list' in str implicitamente

come faccio a passare tutti gli elementi di punti a myprog.exe? sono condannato a dover fare str (punti) e quindi myprog.exe lo analizza per virgole, apostrofi, ecc.? per es.,

  

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

     

`> > > str (x)

     

" ['a', 'b'] "

o dovrei creare una stringa enorme in anticipo? per es.,

  

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

     

'> > > stringa i (x)

     

'a b'

dove stringify sarebbe qualcosa di simile


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

È stato utile?

Soluzione

Prova a utilizzare string.join:

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

Altri suggerimenti

args può essere una sequenza:

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

Questo è più corretto se i tuoi argomenti contengono metacaratteri della shell, ad es. '* e non li vuoi interpretare come tali.

Evita di concatenare tutti gli argomenti in una stringa usando quella stringa.

È molto più semplice, migliore e più sicuro passare semplicemente una sequenza (elenco o tupla) di argomenti. Ciò è particolarmente vero se qualsiasi argomento contiene un carattere spazio (che è abbastanza comune per i nomi di file).

Hai pensato che potresti voler racchiudere quelle stringhe tra virgolette, nel caso in cui abbiano spazi incorporati? Qualcosa del tipo:

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

Ciò allunga la stringa, ma preserva l'integrità dei singoli elementi nell'elenco.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top