在optparse描述中的ASCII艺术

15

我正在使用optparse模块编写一个shell脚本,只是出于兴趣,所以我想在描述的位置打印一个漂亮的ASCII图形。

结果发现这段代码:

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.''')

呈现效果如下:

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

我已经尝试了各种组合的反斜杠、换行符和空格,但都没有成功。

你能否帮助我正确地显示龙猫(Totoro)呢,Python大佬?

3个回答

11

默认的格式化程序IndentedHelpFormatter会调用此方法:

 def format_description(self, description):
    if description:
        return self._format_text(description) + "\n"
    else:
        return ""
如果您子类化IndentedHelpFormatter,则可以删除导致问题的self._format_text调用:
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
谷歌翻译说结语的意思是:“蟑螂能够成功地计划,将他们混凝土盒子里的臭热血液扔掉。现在人类是一种漫游太空的物种,星际流浪者。”哈哈! - unutbu
看起来就是我要找的,非常感谢您,先生。 - tutuca

9
抱歉打扰了,如果您已经升级到2.7版本,现在您可以通过简单地传递文本,轻松地在描述中显示ASCII艺术。
formatter_class=argparse.RawDescriptionHelpFormatter

转换为 argparse.ArgumentParser()

参考示例请见http://docs.python.org/2/library/argparse.html#formatter-class


0
如果所有其他方法都失败了,就使用代码生成。
最简单的方法是创建一个包含所需输出的文本文件,对其进行base64编码,并将其嵌入到 .py 文件中,该文件公开一个全局变量。
现在需要包含生成的 .py 文件,解码 base64 并打印全局变量,这样一切就都可以工作了。

你在开玩笑吧?对吧?虽然我欣赏你提出的建议的精神 :) - tutuca
1
不,我不是在开玩笑。肯定有更好的方法,但如果你找不到,这个也可以。 - Joshua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接