Sto scrivendo uno script Python che accetta percorsi di file come stringhe, li analizza, aggiunge un nome di comando e crea un elenco, che viene quindi passato a subprocess.Popen()
per l'esecuzione. Questo script gestisce sia i percorsi di file Unix che Windows e, in definitiva, dovrebbe essere eseguito su entrambi i sistemi.Come impedire l'escape automatico di caratteri speciali in Python
Quando eseguo questo sotto Unix, se fornisco un percorso di Windows che inavvertitamente contiene un carattere di escape (ad esempio \Users\Administrator\bin
), Python interpreterà l'\b
incorporato come carattere di backspace. Voglio impedire che ciò accada.
Per quanto ne so, non esiste alcuna funzione o metodo per denotare una variabile stringa come stringa non elaborata. Il modificatore 'r'
funziona solo per le costanti di stringa.
Finora, la più vicina sono stato in grado di ottenere è questo:
winpath = "C:\Users\Administrator\bin"
winpath = winpath.replace('\b','\\b')
winpathlist = winpath.split('\\')
A questo punto, dovrebbe contenere winpathlist ['C:','Users','Administrator','bin']
, non ['C','Users','Administrator\x08in']
.
posso aggiungere ulteriori chiamate a winpath.replace()
per gestire le altre fughe che potrei ottenere - \a
, \f
, \n
, \r
, \t
, \v
- ma non \x
.
Esiste un modo più pitonico per farlo?
Come si ottiene il valore nella stringa? Python non dovrebbe trattare il \ b come una fuga a meno che non si trovi in una stringa letterale, o entri nella stringa come una fuga per cominciare. (Inoltre, le barre di avanzamento funzionano bene.) – geoffspear
@Wooble: Al momento, sta arrivando via doctest. >>> myCommandObject.setExcecutablePath ('C: \ Programmi \ cygwin \ cdrive \ bin') dove myCommandObject contiene un nome di comando (ad es. 'ps'), un percorso e un elenco di argomenti. Cambiare le barre dai backslash alle barre non è un'opzione; il mio cliente ha dichiarato esplicitamente che questo è ciò che voleva. – poltr1
Come ho detto, r funziona solo con stringhe letterali; non funziona per variabili stringa. Guardo il primo r come un kluge. Comunque, ecco il doctest (o parte di esso): >>> myCommand.setExecutablePath ('C: \ Program Files \ cygwin \ cdrive \ bin') >>> myCommandList = myCommand.getLaunchList() >> > myCommandList ['C: \\\\ Programmi \\\\ cygwin \\\\ cdrive \\\\ bin \\\\ ps', '-e', '-f'] >>> myCommandList [0] .split ("\\\\") ['C:', 'Programmi', 'cygwin', 'cdrive', 'bin', 'ps'] Non ho più bisogno di errori, ora che ho aggiunto la chiamata per sostituire. – poltr1