Estoy escribiendo un script de Python que acepta rutas de archivos como cadenas, las analiza, agrega un nombre de comando y crea una lista, que luego se pasa al subprocess.Popen()
para su ejecución. Este script es para manejar rutas de archivos de Unix y Windows, y finalmente debe ejecutarse en ambos sistemas.Cómo prevenir el escape automático de caracteres especiales en Python
Cuando ejecuto esto en Unix, si proporciono una ruta de Windows que inadvertidamente contiene un carácter de escape (por ejemplo, \Users\Administrator\bin
), Python interpretará el \b
incrustado como el carácter de retroceso. Quiero evitar que eso suceda.
Hasta donde yo sé, no hay ninguna función o método para denotar una variable de cadena como una cadena sin formato. El modificador 'r'
solo funciona para constantes de cadena.
Hasta el momento, lo más cerca que he sido capaz de conseguir es la siguiente:
winpath = "C:\Users\Administrator\bin"
winpath = winpath.replace('\b','\\b')
winpathlist = winpath.split('\\')
En este punto, debe contener winpathlist ['C:','Users','Administrator','bin']
, no ['C','Users','Administrator\x08in']
.
puedo añadir llamadas adicionales a winpath.replace()
para manejar el otro escapa que podría conseguir - \a
, \f
, \n
, \r
, \t
, \v
- pero no \x
.
¿Hay una manera más pitonica de hacer esto?
¿Cómo está obteniendo el valor en la cadena? Python no debería tratar el \ b como un escape a menos que esté en un literal de cadena, o se meta en la cadena como un escape para empezar. (Además, las barras diagonales funcionan bien) – geoffspear
@Wooble: ahora mismo, entra por doctest. >>> myCommandObject.setExcecutablePath ('C: \ Archivos de programa \ cygwin \ cdrive \ bin') donde myCommandObject contiene un nombre de comando (por ejemplo 'ps'), una ruta y una lista de argumentos. Cambiar las barras desde barras invertidas a barras diagonales no es una opción; mi cliente declaró explícitamente que esto es lo que quería. – poltr1
Como dije, r solo funciona para literales de cadena; no funciona para las variables de cadena. Miro a la r principal como un kluge. De todos modos, aquí está el doctest (o parte de ella): >>> myCommand.setExecutablePath ('C: \ Archivos de programa \ cygwin \ cdrive \ bin') >>> myCommandList = myCommand.getLaunchList() >> > myCommandList ['C: \\\\ Archivos de programa \\\\ cygwin \\\\ cdrive \\\\ bin \\\\ ps', '-e', '-f'] >>> myCommandList [0] .split ("\\\\") ['C:', 'Archivos de programa', 'cygwin', 'cdrive', 'bin', 'ps'] Ya no recibo ninguna errores, ahora que agregué la llamada para reemplazar. – poltr1