python - 如何子类化 pyCLI 的 cli.app.CommandLineApp?

标签 python

The documentation关于 CommandLineApp 的子类化真的很模糊,只提到一个例子:

class YourApp(cli.app.CommandLineApp):
    def main(self):
        do_stuff()

根据我找到的信息,我拼凑了这段代码:

#!/usr/bin/env python

import os
import sys
from cli.app import CommandLineApp

# Append the parent folder to the python path
sys.path.append(os.path.join(os.path.dirname(__file__), '../'))

import tabulardata
from addrtools import extract_address

class SplitAddressApp(CommandLineApp):
    def main(self):
        """
        Split an address from one column to separate columns.
        """

        table = tabulardata.from_file(self.params.file)

        def for_each_row(i, item):
            addr = extract_address(item['Address'])
            print '%-3d %-75s %s' % (i, item['Address'], repr(addr))

        table.each(for_each_row)

    def setup(self):
        self.add_param('file', metavar='FILE', help='The data file.')
        self.add_param(
            'cols', metavar='ADDRESS_COLUMN', nargs='+',
            help='The name of the address column. If multiple names are ' + \
                 'passed, each column will be checked for an address in order'
        )

if __name__ == '__main__':
    SplitAddressApp().run()

这对我来说似乎是正确的。该文档没有提供有关如何处理 setup 方法或在使用子类化时运行应用程序的示例。我收到错误:

Traceback (most recent call last):
  File "bin/split_address_column", line 36, in 
    SplitAddressApp().run()
  File "/Users/tomas/.pythonbrew/venvs/Python-2.7.3/address_cleaner/lib/python2.7/site-packages/cli/app.py", line 440, in __init__
    Application.__init__(self, main, **kwargs)
  File "/Users/tomas/.pythonbrew/venvs/Python-2.7.3/address_cleaner/lib/python2.7/site-packages/cli/app.py", line 129, in __init__
    self.setup()
  File "bin/split_address_column", line 28, in setup
    self.add_param('file', metavar='FILE', help='The data file.')
  File "/Users/tomas/.pythonbrew/venvs/Python-2.7.3/address_cleaner/lib/python2.7/site-packages/cli/app.py", line 385, in add_param
    action = self.argparser.add_argument(*args, **kwargs)
AttributeError: 'SplitAddressApp' object has no attribute 'argparser'

所以大概我做错了什么,但是什么?

最佳答案

我想通了。阅读 pyCLI 的源代码发现 setup 函数对于整个库的功能非常重要,而我认为它只是一个可以放置设置代码的函数。 argparser 是在 cli.app.CommandLineApp.setup 中创建的,这意味着我至少必须调用

cli.app.CommandLineApp.setup(self)

在设置函数中它甚至可以工作。现在代码可以完美运行了!

关于python - 如何子类化 pyCLI 的 cli.app.CommandLineApp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12341444/

相关文章:

python 解压缩文件并提供 wxPython 状态栏更新

python - 根据多个条件(lt、gt 测试标准)将数据帧索引作为值分配给另一个数据帧

python-rq worker 不读取队列中的作业

python - 如何使用按钮在 matplotlib 中的两个不同图形之间切换

python - Dash 数据表下载到 Excel

python - 如何从类中的方法动态创建模块级函数

python - 引用字典中列表中的集合的值

python - 从 Android 客户端调用在 Azure VM 中运行的 python 函数

python - 等待执行者的 future : Future can't be used in 'await' expression

python - 传递要加密的变量 Fernet Python