2010-04-22 2 views
6

Il m'est arrivé de créer automagiquement de petits scripts shell à partir de Python, et je veux m'assurer que les arguments du nom de fichier ne contiennent pas de caractères spéciaux non échappés. J'ai roulé ma propre solution, que je vais fournir comme une réponse, mais je suis presque certain d'avoir vu une telle fonction perdue quelque part dans la bibliothèque standard. Par "perdu", je veux dire que je ne l'ai pas trouvé dans un module évident comme shlex, cmd ou subprocess.Citation des caractères spéciaux du shell POSIX dans la sortie Python

Connaissez-vous une telle fonction dans le stdlib? Si oui, où est-ce?

Même une réponse négative (mais précise et correcte :) sera acceptée.

+1

duplication possible de [Quelle est la meilleure façon d'échapper les appels os.system() en Python?] (Http://stackoverflow.com/questions/35817/whats-the-best-way-to-escape-os- system-calls-in-python) - Même si l'autre parle de os.system et ce n'est pas le cas, c'est la même citation dans le même but. Et il a les mêmes réponses. –

Répondre

6

pipes.quote():

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

Bien Notez qu'il est sans doute eu un bug où un arg zéro longueur retournera rien: Il serait probablement mieux

>>> quote("") 
'' 

si elle est revenu '""'.

+0

Oui, merci! Et c'est dans un module évident (pour un utilisateur POSIX), donc je me suis trompé. – tzot

+0

Parfois, 'subprocess.list2cmdline' est également utile; il n'échappe pas aux métachars shell, mais gère les échappements de citations et d'échappements, donc c'est assez bon quand vous voulez * invoquer un shell distant mais il passe par une ou plusieurs couches supplémentaires de déséchappement sur le chemin, comme via Invocation de commande distante 'ssh'. –

1

La fonction que j'utilise est:

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

qui est: Je joins toujours le nom de fichier entre guillemets, et cite les seuls caractères spéciaux à l'intérieur des guillemets doubles.

+0

N'est-il pas exaspérant quand vous posez une question juste pour y répondre, et que c'était une dupe en premier lieu? : P (Cela m'est arrivé récemment, aussi.) –

+0

@Roger: Hell. Le mécanisme de recherche de SO doit être amélioré. J'ai * cherché * une réponse avant de demander. Notez que ma réponse n'a jamais été destinée à être choisie comme * la * réponse. J'ai également voté pour la clôture de la question. – tzot

+0

[En effet, il le fait.] (Http://meta.stackexchange.com/questions/42878/show-related-questions-just-before-question-submission) Je n'essayais pas de dire quelque chose de mal à propos de votre demande à la question (il peut même être difficile de chercher après tous les processus de réflexion qui ont été écrits et affichés), juste essayer de partager la frustration. –

Questions connexes