invia un numero arbitrario di input da Python a un file .exe
-
05-07-2019 - |
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
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.