作为 argparse 参数的目录路径

Posted

技术标签:

【中文标题】作为 argparse 参数的目录路径【英文标题】:path to a directory as argparse argument 【发布时间】:2016-12-14 12:48:56 【问题描述】:

我想在add_argument()ArgumentParser() 中接受目录路径作为用户输入。

到目前为止,我已经写了这个:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('path', option = os.chdir(input("paste here path to biog.txt file:")), help= 'paste path to biog.txt file')

这个问题的理想解决方案是什么?

【问题讨论】:

add_argument 不采用option 参数。这个路径名应该来自命令行吗?解析后改路径可以吗? 请注意,argparse 似乎有严重的限制:添加参数的方法不检查有效路径。对我来说似乎是核心功能,但它仍然非常有用。与此同时,您需要添加自己的逻辑来检查每条路径。有些人编写了一个额外的类来实现这一点:gist.github.com/brantfaircloth/1443543 另见***.com/questions/11415570/…。 directory path types with argparse的可能重复 【参考方案1】:

可以确保路径是一个有效的目录,例如:

import argparse, os

def dir_path(string):
    if os.path.isdir(string):
        return string
    else:
        raise NotADirectoryError(string)

parser = argparse.ArgumentParser()
parser.add_argument('--path', type=dir_path)

# ...

可以使用os.path.isfile() 来检查文件,或者使用os.path.exists() 来检查两者中的任何一个。

【讨论】:

【参考方案2】:

Argument Parser(argparse) 示例:添加了自定义处理程序的不同类型的参数。对于 PATH,您可以传递 "-path" 后跟路径值作为参数

import os
import argparse
from datetime import datetime


def parse_arguments():
    parser = argparse.ArgumentParser(description='Process command line arguments.')
    parser.add_argument('-path', type=dir_path)
    parser.add_argument('-e', '--yearly', nargs = '*', help='yearly date', type=date_year)
    parser.add_argument('-a', '--monthly', nargs = '*',help='monthly date', type=date_month)

    return parser.parse_args()


def dir_path(path):
    if os.path.isdir(path):
        return path
    else:
        raise argparse.ArgumentTypeError(f"readable_dir:path is not a valid path")


def date_year(date):
    if not date:
        return

    try:
        return datetime.strptime(date, '%Y')
    except ValueError:
        raise argparse.ArgumentTypeError(f"Given Date(date) not valid")


def date_month(date):
    if not date:
        return

    try:
        return datetime.strptime(date, '%Y/%m')
    except ValueError:
        raise argparse.ArgumentTypeError(f"Given Date(date) not valid")


def main():
    parsed_args = parse_arguments()

if __name__ == "__main__":
main()

【讨论】:

【参考方案3】:

你可以使用类似的东西:

import argparse, os

parser = argparse.ArgumentParser()
parser.add_argument('--path', help= 'paste path to biog.txt file')
args = parser.parse_args()


os.chdir(args.path) # to change directory to argument passed for '--path'

print os.getcwd()

在运行脚本时将目录路径作为参数传递给--path。另外,检查官方文档argparse的正确用法:https://docs.python.org/2/howto/argparse.html

【讨论】:

以上是关于作为 argparse 参数的目录路径的主要内容,如果未能解决你的问题,请参考以下文章

Python 杂记:argparse 模块

在 python 中调试 argpars

命令行参数随后argparse选项

python argpare 模块的简单用法

如何测试我的代码是不是引发了适当的 argparse 异常?

来自目录的 argparse python 参数