2010-04-22 5 views
6

Ci sono volte in cui creo automaticamente piccoli script di shell da Python, e voglio assicurarmi che gli argomenti del nome del file non contengano caratteri speciali senza escape. Ho preparato la mia soluzione, che fornirò come risposta, ma sono quasi sicuro di aver visto una funzione simile persa da qualche parte nella libreria standard. Per "perso" intendo che non l'ho trovato in un modulo ovvio come shlex, cmd o subprocess.Quota POSIX caratteri speciali della shell in uscita Python

Conoscete questa funzione nello stdlib? Se sì, dov'è?

Anche una risposta negativa (ma definita e corretta :) sarà accettata.

+1

possibile duplicato di [Qual è il modo migliore per sfuggire alle chiamate os.system() in Python?] (Http://stackoverflow.com/questions/35817/whats-the-best-way-to-escape-os- system-calls-in-python) - Anche se l'altro sta parlando di os.system e questo non lo è, è la stessa citazione per lo stesso scopo. E ha le stesse risposte. –

risposta

6

pipes.quote():

>>> from pipes import quote 
>>> quote("""some'horrible"string\with lots of junk!$$!""") 
'"some\'horrible\\"string\\\\with lots of junk!\\$\\$!"' 

Anche se nota che è senza dubbio ha un bug in cui un ARG lunghezza zero restituirà nulla:

>>> quote("") 
'' 

Probabilmente sarebbe meglio se è tornato '""'.

+0

Sì, grazie! Ed è in un modulo ovvio (per un utente POSIX), quindi mi sono sbagliato. – tzot

+0

Anche 'subprocess.list2cmdline' è utile; non * evita i metacarhi della shell, ma gestisce l'escaping di quoting e di escape degli spazi, quindi è abbastanza buono quando * vuoi * invocare una shell remota ma sta passando attraverso uno o più strati aggiuntivi di de-escaping sulla strada, come via chiamata al comando remoto 'ssh'. –

1

La funzione che uso è:

def quote_filename(filename): 
    return '"%s"' % (
     filename 
     .replace('\\', '\\\\') 
     .replace('"', '\"') 
     .replace('$', '\$') 
     .replace('`', '\`') 
    ) 

che è: ho sempre allego il nome del file tra virgolette, e poi citare i soli caratteri speciali all'interno di doppi apici.

+0

Non è esasperante quando fai una domanda solo per rispondere, e in primo luogo era un vero capriccio? : P (Mi è successo anche solo di recente.) –

+0

@Roger: Hell. Il meccanismo di ricerca di SO ha bisogno di miglioramenti. Ho * cercato * una risposta prima di chiedere. Si noti che la mia risposta non è mai stata intesa per essere scelta come * la * risposta. Ho anche votato per la chiusura della domanda. – tzot

+0

[Infatti, lo fa.] (Http://meta.stackexchange.com/questions/42878/show-related-questions-just-before-question-submission) Non stavo cercando di dire qualcosa di negativo sul tuo chiedere domanda (può anche essere difficile da cercare fino a dopo tutti i processi mentali che sono andati a scrivere e pubblicare), solo cercando di condividere la frustrazione. –