用于一致命令行工具的实用程序

cmdline的Python项目详细描述


命令行

CMDLine包提供了一种指定和重写命令设置和日志记录配置的标准方法。使用命令行设置就像创建settings.yml

REMOTE_ADDR:
  default: 'https://example.com/'
  help: the remote address

并在主程序中编译设置:

from cmdline import SettingsParser, settings


def main():
    SettingsParser.compile_settings()

    remote = settings.REMOTE_ADDR

    print('remote addr:', remote)


if __name__ == '__main__':
    sys.exit(main())

然后可以通过以下任何方式调用您的程序:

$ remote
remote addr: https://example.com/
$ export REMOTE_ADDR=https://env.example.com/
$ remote
remote addr: https://env.example.com/
$ remote --remote-addr=https://arg-takes-precedence.example.com/
remote addr: https://arg-takes-precedence.example.com/

安装

pip install cmdline

设置

设置是以覆盖方式配置的,从应用程序打包的根配置开始。标准的argparse选项用于配置设置。

覆盖默认值

打包的设置可以被文件系统上的其他设置文件、环境变量和最后的命令行参数覆盖。对于名为remote的命令,它们的应用顺序是:

  • 打包设置
  • <;sys.prefix>;/etc/remote/settings.yml
  • ~/.remote/settings.yml
  • 环境变量
  • 命令行参数

环境变量完全映射到设置的名称,即环境变量REMOTE_ADDR配置REMOTE_ADDR设置。

命令行参数是设置的小写虚线版本,例如,命令行参数--remote-addr配置REMOTE_ADDR设置。

子命令

设置分析器支持argparse subcommands。通过向设置的选项中添加_subcommand键,可以将设置配置为子命令。例如:

COPY_FORCE
  default: no
  _subcommand: copy

_SUBCOMMAND设置包含使用命令运行的子命令的名称。

文件

可以在_COMMANDS节中添加命令说明和帮助文本。_main将设置主程序的描述。任何其他键都将与同名的子命令相对应。例如,下面设置主程序的说明以及copy子命令的说明和帮助文本:

_COMMANDS:
  _main:
    description: >
      this is main description and can be a very long string
      that covers multiple lines
  copy:
    description: >
      this is copy subcommand description and can be a very long string
      that covers multiple lines
    help: copy files

类型转换

可以使用argparse的type设置将设置转换为特定类型。例如,设置type: int将把设置转换为整数。这是通过使用python的内置int()函数实现的。

type是虚线字符串时,将导入并使用给定函数。例如,设置type: convesion.convert_bool将调用conversion包中的convert_bool()函数。

日志记录

类似地,日志记录是通过python的logging.config.dictConfig()函数配置的。有关dictconfig的更多信息,请参见docs.python.org;下面是一个示例。此配置设置一个console处理程序,该处理程序将日志发送到stdout,并设置一个null处理程序,该处理程序丢弃日志。默认的日志配置是将警告级别和更高级别的消息记录到控制台(由root日志记录器设置),并为mypkg.foomypkg.bar日志记录器配置另外两个日志记录器,其中mypkg.foo的日志级别设置为调试,并将mypkg.bar一起抛出。

version: 1
disable_existing_loggers: False

formatters:
  simple:
    format: "%(asctime)s %(name)s:%(lineno)d %(levelname)s %(message)s"


handlers:
  console:
    class: logging.StreamHandler
    level: WARN
    formatter: simple
    stream: ext://sys.stdout

  "null":
    class: logging.NullHandler


loggers:
  mypkg.foo:
    level: DEBUG
    handlers: [console]
    propagate: no

  mypkg.bar:
    handlers: ["null"]
    propagate: no


root:
  level: WARN
  handlers: [console]

写入配置后,通过调用setup_logging()函数配置日志记录:

import logging
from cmdline import setup_logging


def main():
    setup_logging()

    logging.getLogger(__name__).warning('ello')


if __name__ == '__main__':
    sys.exit(main())

日志级环境

唯一可以在配置文件之外更新的日志配置是默认日志级别,可以使用环境变量LOG_LEVEL来更改;例如LOG_LEVEL=debug remote

文件位置

创建名为config的目录。在该目录中,创建文件logconfig.ymlsettings.yml。正确安装这些文件的基本步骤如下:

#!/usr/bin/env python 
import os

from setuptools import setup


def get_data_files(base):
    for dirpath, dirnames, filenames in os.walk(base):
        for filename in filenames:
            yield os.path.join(dirpath, filename)


data_files = [
    ('config', list(get_data_files('config'))),
]

setup(name='remote',
      version='0.0.1',
      packages=['remote'],
      data_files=data_files,
      entry_points = {
          'console_scripts': [
              'remote = remote.command:main',
          ],
      },
)

上面setup.py的文件结构如下:

root_dir/
+- remote/
|  +- __init__.py
|  +- command.py
+- config/
|  +- logconfig.yml
|  +- settings.yml
+- setup.py

配置根环境变量

设置环境变量CMDLINE_CONFIG_ROOT将使给定路径成为设置和日志记录的主要配置位置。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何发送JSON post请求,并在restAssured中的请求正文中列出一个列表   java JBREM000202:远程连接58fb662d到/127.0.0.1:9990时突然关闭   swing如何在不传递ID的情况下识别运行在哪个Java小程序上下文中?   java在5个插槽中打印PDF   将rawbyte值转换为Java类型   JAVAutil。vCPU为2时并发Java runAsync和ForkJoin   javascript 2.9是14.5,对于给定的4个条目,分数为20,是否正确   java扫描程序构造函数导致bufferedReader返回null   JavaFacebook图形API:获取给定用户的评论   java在循环中创建JButtons只会导致最后一个出现   java调用二维数组   java Testng不工作   转换ß。在java中使用toUpperCase()将cfg转换为大写   用java调用C++ DLL   java格式化Excel工作表中的日期