如何使 argparse 接受脚本中的目录?

How to make argparse accept directories in script?

目前,this script 只接受文件作为输入(通过 argparse)。我正在尝试对其进行编辑,以便它也可以接受路径作为输入。我该怎么做?

脚本(省略无关部分):

#!/usr/bin/env python

import argparse
import sys

def main(args=None):
    parser = argparse.ArgumentParser()
    parser.add_argument("input", nargs="+", metavar="INPUT")
    parser.add_argument("-o", "--output")
    options = parser.parse_args(args)

    for path in options.input:
        if options.output and not os.path.isdir(options.output):
            output = options.output

        font = TTFont(path, fontNumber=options.face_index)


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

告别os.path,迎接pathlib

>>> import pathlib
>>> p = pathlib.Path("")
>>> p
PosixPath('.')

>>> p.absolute()
PosixPath('/storage/emulated/0')

>>> p = p.joinpath("log/GearLog")
>>> p
PosixPath('log/GearLog')

>>> p.is_dir()
True

>>> for file in (f for f in p.iterdir() if f.suffix == ".log"):
...     print(file.name)
...
GearN_dumpState-CM.log
GearN_dumpState-CM_old.log
GearN_dumpState-WIFI_P2P.log
GearN_dumpState-HM.log
GearN_dumpState-HM_old.log
GearN_dumpState-NS_HM.log
GearN_dumpState-NS_HM_old.log
GearN_dumpState-NS_GO.log
GearN_dumpState-NS_GO_old.log
GearN_dumpState-ESIM.log
GearN_dumpState-CS.log
GearN_dumpState-CT.log
GearN_dumpState-SM.log
GearN_dumpState-WF.log
GearN_dumpState-STICKER.log
GearN_dumpState-SEARCH.log
GearN_dumpState-WF_old.log
>>>

有了这个,你可以传递任何类型的 file/directory 字符串并检查它是目录还是文件,以及它是否存在。我用它通过 argparse.

传递路径参数

你没有明确说明你知道 pathlib 的存在并且你知道你将不得不使用它,我省略了如何在 argparse 中使用它并投入更多精力来演示如何方便pathlib是,一般怎么用。

正如您现在所说的那样,您确实知道它的存在,这是它实际完成的方式。

import argparse
import pathlib


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("path", nargs="+", type=pathlib.Path)

    args = parser.parse_args()

    print([path.absolute() for path in args.path])

> scratch.py ./ X:\ Z:\

[WindowsPath('[REDACTED]/scratches'), WindowsPath('X:/'), WindowsPath('Z:/')]