Lorsque vous utilisez os.system (), il est souvent nécessaire d'échapper aux noms de fichiers et autres arguments passés en paramètres aux commandes. Comment puis-je faire ceci? De préférence quelque chose qui fonctionnerait sur plusieurs systèmes d'exploitation / shells mais en particulier pour bash.
Je fais actuellement ce qui suit, mais je suis sûr qu'il doit y avoir une fonction de bibliothèque pour cela, ou au moins une option plus élégante / robuste / efficace:
def sh_escape(s):
return s.replace("(","\\(").replace(")","\\)").replace(" ","\\ ")
os.system("cat %s | grep something | sort > %s"
% (sh_escape(in_filename),
sh_escape(out_filename)))
Edit: j'ai accepté la réponse simple d'utiliser des guillemets, je ne sais pas pourquoi je n'y ai pas pensé; Je suppose que parce que je suis venu de Windows où «et» se comportent un peu différemment.
En ce qui concerne la sécurité, je comprends le problème, mais, dans ce cas, je suis intéressé par une solution rapide et facile fournie par os.system (), et la source des chaînes n'est pas générée par l'utilisateur ou du moins saisie par un utilisateur de confiance (moi).
sh_escape
fonction idéale échapperait aux ;
espaces et et éliminerait le problème de sécurité en créant simplement un fichier appelé quelque chose comme foo.txt\;\ rm\ -rf\ /
.