2013-05-31 3 views
2

SOLVEDPython: Pourquoi cette chaîne est-elle invalide?

J'ai cette chaîne:

' ServerAlias {hostNameshort}.* www.{hostNameshort}.*'.format(hostNameshort=hostNameshort) 

Mais il continue à me donner une erreur de syntaxe. La ligne est censé être ce bash équivalent:

echo " ServerAlias ${hostOnly}.* www.${hostOnly}.*" >> $prjFile 

Rappelez-vous la première chaîne est une partie d'une fonction de myFile.write mais qui n'est pas la question, je ne peux même pas la chaîne à faire assez sens pour lui de me laisser exécuter le programme.

Traceback:

File "tomahawk_alpha.py", line 89 
    ' ServerAlias {hostNameshort}.* www.{hostNameshort}.*'.format(hostNameshort=hostNameshort) 
                 ^

Mais peu importe comment je change que ' symbole, il ne semble pas fonctionner. Qu'est-ce que je fais mal?

En réponse à @mgilson:

myFile = open(prjFile, 'w+') 
    myFile.write("<VirtualHost 192.168.75.100:80>" 
       " ServerName www.{hostName}".format(hostName=hostName) 
       ' ServerAlias {hostNameshort}.* www.{hostNameshort}.*'.format(hostNameshort=hostNameshort) 
       " DocumentRoot ", prjDir, "/html" 
       ' CustomLog "\"|/usr/sbin/cronolog /var/log/httpd/class/',prjCode,'/\{hostName}.log.%Y%m%d\" urchin"'.format(hostName=hostName) 
       "</VirtualHost>") 
    myFile.close() 

j'avais chaque ligne dans sa propre ligne de myFile.write, mais elle ne produit la première ligne et puis quittez. Donc j'ai supposé l'appeler une fois et l'espacer comme cela créerait le résultat voulu.

+0

Je ne vois rien de mal avec la chaîne. Toutes vos parenthèses sont-elles fermées sur la ligne précédente? – mgilson

+0

Dans votre traceback, il semble que vous ayez supprimé le type d'erreur. Pouvez-vous inclure cela afin que nous puissions mieux diagnostiquer le problème? – SethMMorton

+0

Le problème pourrait être sur la ligne précédente comme mentionné par mgilson. Vous devriez également vérifier que tous les '' 'sont également fermés. – SethMMorton

Répondre

4

Vous avez quelques erreurs de syntaxe. Cependant, vous voudrez peut-être regarder à l'aide d'une chaîne triplement cité à la place - beaucoup plus facile à modifier à long terme:

myFile.write("""<VirtualHost 192.168.75.100:80> 
       ServerName www.{hostName} 
       ServerAlias {hostNameshort}.* www.{hostNameshort}.* 
       DocumentRoot {prjDir}/html 
       CustomLog "\"|/usr/sbin/cronolog /var/log/httpd/class/{prjCode}/\{hostName}.log.%Y%m%d\" urchin" 
      </VirtualHost>""".format(hostName=hn, hostNameshort=hns, prjDir=prjd, prjCode=prjc)) 
+0

Merci beaucoup! –

+0

Cela fonctionne à merveille, et je vais utiliser ce système triplement cité avec .format plus souvent. Très agréable! –

5

concaténation de chaîne automatique fonctionne uniquement avec chaînes littérales:

"foo" "bar" 

résultats dans "foobar"

Mais, ce qui suit ne fonctionnera pas:

("{}".format("foo") 
"bar") 

qui est analogue à ce que vous êtes Faire. L'analyseur voit quelque chose comme ceci:

"{}".format("foo") "bar" 

(car il rejoint les lignes où il y a des parenthèses) et unterminated qui est manifestement pas une syntaxe valide. Pour le réparer, vous devez concaténer les chaînes explicitement. par exemple:

("{}".format("foo") + 
"bar") 

Ou d'utiliser la mise en forme de chaîne sur la chaîne entière, et pas seulement une partie à la fois.