2010-08-22 79 views
14

Estoy haciendo un script de shell con el módulo optparse, pero para la diversión, así que quería imprimir un bonito dibujo de ASCII en lugar de la descripción.Arte ASCII en la descripción optparse

Resulta que este código:

parser = optparse.OptionParser(
    prog='./spill.py', 
    description=u''' 
/ \          
    vvvvvvv /|__/|        
     I /O,O |        
     I /_____ |  /|/|     
    J|/^^^ \ | /00 | _//|   
     |^^^^|W| |/^^\ | /oo |   
     \m___m__|_| \m_m_| \mm_|   
''', 
    epilog=''' 
     Las cucarachas lograron con exito su plan, echando a los pestilentes sangre caliente de sus cajas de cemento. 
Ahora el hombre es una especie errante en el espacio, un vagabundo errante en las estrellas.''') 

renders así:

$ ./bin/spill.py -h 
Usage: ./spill.py [options] 

/ \          vvvvvvv /|__/| 
I /O,O |         I /_____ |  /|/| 
J|/^^^ \ | /00 | _//|     |^^^^|W| |/^^\ | /oo | 
\m___m__|_| \m_m_| \mm_| 

Options: 
    -h, --help   show this help message and exit 
#.... bla bla bla, etc 

He intentado una combinación variable de barras, de líneas nuevas y Espacios sin éxito.

¿Puede usted, amigo pytonista, ayudarme a mostrar Totoro correctamente?

Respuesta

11

El formateador predeterminado, IndentedHelpFormatter, llama a este método:

def format_description(self, description): 
    if description: 
     return self._format_text(description) + "\n" 
    else: 
     return "" 

Si subclase IndentedHelpFormatter, puede eliminar la llamada self._format_text que está causando el problema:

import optparse 

class PlainHelpFormatter(optparse.IndentedHelpFormatter): 
    def format_description(self, description): 
     if description: 
      return description + "\n" 
     else: 
      return "" 

parser = optparse.OptionParser(
    prog='./spill.py', 
    formatter=PlainHelpFormatter(), 
    description=u''' 
/ \          
    vvvvvvv /|__/|        
     I /O,O |        
     I /_____ |  /|/|     
    J|/^^^ \ | /00 | _//|   
     |^^^^|W| |/^^\ | /oo |   
     \m___m__|_| \m_m_| \mm_|   
''', 
    epilog=''' 
     Las cucarachas lograron con exito su plan, echando a los pestilentes sangre caliente de sus cajas de cemento. 
Ahora el hombre es una especie errante en el espacio, un vagabundo errante en las estrellas.''') 
(opt,args) = parser.parse_args() 
+5

Google translate dice que el epilog significa: "Las cucarachas pudieron planear con éxito, arrojando la hedionda sangre caliente de sus cajas de hormigón. Ahora el hombre es una especie de vagar en el espacio, un vagabundo en las estrellas". Jaja! – unutbu

+0

Parece lo que estoy buscando, muchas gracias, señor. La traducción es casi exacta :) – tutuca

+0

De nada, tutuca. ¡Tu epilog es intrigante! :) – unutbu

0

Si todo lo demás falla, usar generación de código

La forma más sencilla sería la creación de un archivo de texto que contiene su salida deseada, y base64 codificar e incrustarlo en un archivo .py que expone una variable global

Ahora tiene que incluir la generada .py, decodificación base64 e imprime la variable global y todo funciona.

+0

Me estás tomando el pelo. ¿Derecha? Aunque aprecio el espíritu de su propuesta :) – tutuca

+1

No, no estoy bromeando. Tiene que haber una manera mejor, pero si no puede encontrarlo, esto funciona. – Joshua

6

Lo siento por la nigromancia hilo, pero para los que la actualización a 2.7 puede mostrar ahora fácilmente el arte ASCII en su descripción simplemente pasando

formatter_class=argparse.RawDescriptionHelpFormatter 

a argparse.ArgumentParser()

ver http://docs.python.org/2/library/argparse.html#formatter-class de ¡ejemplo!

Cuestiones relacionadas