如何构建子命令来绑定也应该独立工作的脚本?

2024-09-26 22:50:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在进行一个手写识别的研究项目(我的学士论文)。到目前为止,我写了很多Python脚本,我想让它们对其他人有用。所以我在PyPI上创建了一个项目:https://pypi.python.org/pypi/hwrt/

目前,只有2个可执行脚本:backup.py和{}。当它通过pip安装时,我可以调用它们,这样可以:

$ backup.py --help
usage: backup.py [-h] [-d FOLDER] [-s] [-o]

Download raw data from online server and back it up (e.g. on dropbox)
handwriting_datasets.pickle.

optional arguments:
  -h, --help            show this help message and exit
  -d FOLDER, --destination FOLDER
                        where do write the handwriting_dataset.pickle
                        (default: /home/moose/Downloads/write-math/archive
                        /raw-datasets)
  -s, --small           should only a small dataset (with all capital letters)
                        be created? (default: False)
  -o, --onlydropbox     don't download new files; only upload to dropbox
                        (default: False)

$ view.py --help
usage: view.py [-h] [-i ID] [--mysql MYSQL] [-m FOLDER]

Display a raw_data_id.

optional arguments:
  -h, --help            show this help message and exit
  -i ID, --id ID        which RAW_DATA_ID do you want?
  --mysql MYSQL         which mysql configuration should be used?
  -m FOLDER, --model FOLDER
                        where is the model folder (with a info.yml)?

我是通过scriptssetup.py得到的:

^{pr2}$

不过,我更希望他们这样称呼:

$ hwrt backup --help
(just what came before for 'backup.py --help')
$ hwrt view --help
(just what came before for 'view.py --help')
$ hwrt --help
(a list of all sub-commands)

我知道这可以通过子命令和argparse来完成。但是,这意味着我必须创建一个新的脚本,在其中绑定argparse的所有命令。但我也希望脚本独立工作。我觉得调整命令行参数更符合逻辑,这些参数只在backup.py中对backup.py重要,而不在另一个文件中。在

有没有办法调整我的脚本,让它们“发现”bin文件夹中的脚本,并将它们全部添加为子命令?在


Tags: and项目py命令脚本pypiviewid
1条回答
网友
1楼 · 发布于 2024-09-26 22:50:35

这可能是使用parents的情况。在

例如,假设两个脚本在加载时都创建了一个parser对象(或者有一个创建解析器的函数):

import argparse
from backup import parser as backup_parser
from view import parser as view_parser

if __name__=='__main__':
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers(dest='cmd')
    # or use the parser.setdefault() as described in the documentation
    backup = subparsers.add_parser('backup', add_help=False, parents=[backup_parser])
    view = subparsers.add_parser('view', add_help=False, parents=[view_parser])
    args = parser.parse_args()

这应该打印适当的帮助。args.cmd将标识子命令,其他属性将是各自的参数。backup子parser将是从backup.py导入的解析器的克隆。(我还没有测试过这个脚本,所以可能有一些拼写错误或错误,但它给出了总体思路。)

How to handle CLI subcommands with argparse讨论了处理子命令的几种方法。在

Ipython使用argparse处理主界面和许多魔术命令。它用配置文件中的参数和值填充解析器。这样,可以使用默认配置、自定义配置或在命令行上设置大量参数。在

相关问题 更多 >

    热门问题