ASCII art in the optparse description
Asked Answered
D

3

15

I'm making a shell script with the optparse module, jut for fun, so I wanted to print a nice ascii drawing in place of the description.

Turns out that this code:

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 like this:

$ ./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

I've tried a varying combination of slashes, newlines and espaces without success.

Can you, friend pytonista, help me display Totoro properly?

Denitadenitrate answered 22/8, 2010 at 21:3 Comment(0)
M
11

The default formatter, IndentedHelpFormatter, calls this method:

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

If you subclass IndentedHelpFormatter, you can remove the self._format_text call which is causing the problem:

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()
Minnick answered 22/8, 2010 at 21:24 Comment(2)
Google translate says the epilog means: "Cockroaches were able to successfully plan, throwing the stinking hot blood of their concrete boxes. Now the man is a species of wandering in space, a wanderer in the stars." LOL!Minnick
Seems like what I'm looking for, thank you very much, sir. The translation is almost accurate :)Denitadenitrate
D
9

Sorry for the thread necromancy, but for those who upgraded to 2.7 you can now easily display ascII art in your description by simply passing

formatter_class=argparse.RawDescriptionHelpFormatter

to argparse.ArgumentParser()

see http://docs.python.org/2/library/argparse.html#formatter-class for example!

Drawknife answered 30/3, 2013 at 18:20 Comment(0)
T
0

If all else fails, use code generation.

The simplest way would be to create a text file containing your desired output, and base64 encode it and embed it in a .py file that exposes a global variable

Now you need to include the generated .py, base64 decode, and print the global variable and it all works.

Tampere answered 22/8, 2010 at 21:29 Comment(2)
You are kidding me. Right? Although I appreciate the spirit of your proposal :)Denitadenitrate
No, I'm not kidding. There's gotta be a better way but if you can't find it, this works.Tampere

© 2022 - 2024 — McMap. All rights reserved.