Cuando se usa os.system () a menudo es necesario escapar de los nombres de archivo y otros argumentos pasados como parámetros a los comandos. ¿Cómo puedo hacer esto? Preferiblemente algo que funcione en múltiples sistemas operativos / shells pero en particular para bash.
Actualmente estoy haciendo lo siguiente, pero estoy seguro de que debe haber una función de biblioteca para esto, o al menos una opción más elegante / robusta / eficiente:
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)))
Editar: he aceptado la respuesta simple de usar comillas, no sé por qué no pensé en eso; Supongo que porque vine de Windows donde 'y "se comportan un poco diferente.
Con respecto a la seguridad, entiendo la preocupación, pero, en este caso, estoy interesado en una solución rápida y fácil que os.system () proporcione, y la fuente de las cadenas no es generada por el usuario o al menos ingresada por un usuario de confianza (yo).
sh_escape
función ideal sería escapar de los ;
espacios y eliminar el problema de seguridad simplemente creando un archivo llamado algo así foo.txt\;\ rm\ -rf\ /
.