首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何构建子命令来捆绑脚本,这些脚本也应该独立工作?

我如何构建子命令来捆绑脚本,这些脚本也应该独立工作?
EN

Stack Overflow用户
提问于 2014-10-09 20:43:43
回答 1查看 211关注 0票数 0

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

目前,只有两个可执行脚本:backup.pyview.py。当它通过pip安装时,我可以调用它们,所以这是可行的:

代码语言:javascript
复制
$ 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)?

这是我在setup.py通过scripts得到的

代码语言:javascript
复制
try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

config = {
    'name': 'hwrt',
    'version': '0.1.19',
    'author': 'Martin Thoma',
    'author_email': 'info@martin-thoma.de',
    'packages': ['hwrt'],
    'scripts': ['bin/backup.py', 'bin/view.py'],
    'url': 'https://github.com/MartinThoma/hwrt',
    'license': 'MIT',
    'description': 'Handwriting Recognition Tools',
    'long_description': """A tookit for handwriting recognition. It was
    developed as part of the bachelors thesis of Martin Thoma.""",
    'install_requires': [
        "argparse",
        "theano",
        "nose",
    ],
    'keywords': ['HWRT', 'recognition', 'handwriting', 'on-line'],
    'download_url': 'https://github.com/MartinThoma/hwrt',
}

setup(**config)

然而,我更希望它们被这样命名:

代码语言:javascript
复制
$ 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文件夹中的脚本,并将它们全部添加为子命令?

EN

回答 1

Stack Overflow用户

发布于 2014-10-10 00:55:52

这可能是使用parents的一个例子。

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

代码语言:javascript
复制
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子解析器将是从backup.py导入的解析器的克隆。(我没有测试过这个脚本,所以可能会有一些打字错误或but,但它给出了大致的概念。)

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26278751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档