options.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #!/usr/bin/env python
  2. # -*- encoding: utf-8 -*-
  3. """
  4. @Contact : liuyuqi.gov@msn.cn
  5. @Time : 2023/11/01 00:01:04
  6. @License : Copyright © 2017-2022 liuyuqi. All Rights Reserved.
  7. @Desc : 命令行参数,或配置文件
  8. """
  9. import argparse
  10. import os
  11. import shlex
  12. import dotenv
  13. from collections import OrderedDict
  14. from .utils.str_util import preferredencoding
  15. from crawl_yuque.utils.frozen_dir import get_app_path
  16. def parser_args(overrideArguments=None):
  17. """解析参数"""
  18. argparser = argparse.ArgumentParser()
  19. argparser.add_argument(
  20. 'command',
  21. help='command: ',
  22. choices=['markdown', 'pdf', 'serve', 'version', 'help'],
  23. )
  24. argparser.add_argument('-url', '--url', help='please input a url', type=str)
  25. args = argparser.parse_args()
  26. # remove None
  27. command_line_conf = OrderedDict(
  28. {k: v for k, v in args.__dict__.items() if v is not None}
  29. )
  30. system_conf = user_conf = custom_conf = OrderedDict()
  31. user_conf = _read_user_conf()
  32. try:
  33. if args.config:
  34. custom_conf = _read_custom_conf(args.config)
  35. except Exception as e:
  36. pass
  37. system_conf.update(user_conf)
  38. system_conf.update(command_line_conf)
  39. app_path = get_app_path()
  40. system_conf["app_path"] = app_path
  41. # if args.command == None and args.extractor == None:
  42. # raise 'Error, please input cmd and extractor params11'
  43. return system_conf
  44. def _read_custom_conf(config_path: str) -> OrderedDict:
  45. """读取自定义配置文件 config.yaml"""
  46. def compat_shlex_split(s, comments=False, posix=True):
  47. if isinstance(s, str):
  48. s = s.encode('utf-8')
  49. return list(map(lambda s: s.decode('utf-8'), shlex.split(s, comments, posix)))
  50. try:
  51. with open(config_path, 'r', encoding=preferredencoding()) as f:
  52. contents: str = f.read()
  53. res = compat_shlex_split(contents, comments=True)
  54. except Exception as e:
  55. return []
  56. return res
  57. def _read_user_conf() -> OrderedDict:
  58. """读取用户配置文件: .env 文件"""
  59. user_conf = OrderedDict()
  60. dotenv_path = os.path.join(get_app_path(), '.env')
  61. if os.path.exists(dotenv_path):
  62. user_conf = dotenv.dotenv_values(dotenv_path)
  63. return OrderedDict(user_conf)