Question


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

dans le code ci-dessus, input1, input2 et input3 sont tous des entiers convertis en chaînes. la variable " strpoints " est une liste de longueur arbitraire de chaînes. input1 indique à myprog la longueur des strpoints. bien sûr, quand j'essaye d'exécuter le code ci-dessus, j'obtiens le message d'erreur suivant:

  

TypeError: impossible de convertir l'objet 'list' en str implicitement

comment puis-je transmettre tous les éléments de strpoints à myprog.exe? suis-je condamné à devoir faire str (strpoints) puis à faire analyser par myprog.exe les virgules, les apostrophes, etc.? par exemple,

  

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

     

`> > > str (x)

     

"['a', 'b']"

ou devrais-je créer une énorme chaîne à l'avance? par exemple,

  

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

     

'> > > stringify (x)

     

'a b'

où stringify serait quelque chose comme


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

Était-ce utile?

La solution

Essayez d’utiliser string.join:

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

Autres conseils

Les

arguments peuvent être une séquence:

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

Ceci est plus correct si vos arguments contiennent des métacaractères shell, par exemple. '* et vous ne voulez pas qu'ils soient interprétés comme tels.

Évitez de concaténer tous les arguments dans une chaîne en utilisant cette chaîne.

Il est beaucoup plus simple, meilleur et plus sûr de simplement passer une séquence (liste ou tuple) d'arguments. Ceci est particulièrement vrai si un argument contient un espace (ce qui est assez courant pour les noms de fichiers).

Vous pensez peut-être que vous souhaitez inclure ces chaînes entre guillemets, au cas où elles auraient des espaces incorporés? Quelque chose comme:

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

Cela allonge la durée de votre chaîne, mais préserve l'intégrité de vos éléments individuels dans la liste.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top