如何使 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:/')]
目前,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:/')]