使用Argparse从相对路径获取完整路径

时间:2019-03-20 09:55:09

标签: python python-3.x argparse

我正在为我的脚本编写一个小的命令行实用程序,但是我不知道如何从参数中正确获取完整路径。

这就是我的意思。

parser = ArgumentParser()
parser.add_argument("-src",
                    required = True, help="path to some folder")
args = parser.parse_args()
print(args.src)

如果用户通过完整路径,例如"/home/username/projectname/folder",一切都很好。

但是,如果用户从"projectname"文件夹运行脚本并传递相对路径"./folder",则在解析参数而不是完整路径{时,我会得到完全相同的字符串"./folder" {1}}。

所以,我一直想知道"/home/username/projectname/folder"中是否有某种内置功能可以从相对路径中获取完整路径?

2 个答案:

答案 0 :(得分:5)

编辑Alex's answer显示了如何通过简单地填充argparse的{​​{1}来使add_argument管理相对路径到绝对路径的转换}参数。


我认为argparse不提供这种功能,但是您可以使用os.path.abspath来实现:

type

请记住,这将通过将工作目录与相对路径连接起来而形成绝对路径。因此,该路径被认为是相对于工作目录的。


如果要创建相对于脚本目录的路径,则可以在abs_src = os.path.abspath(args.src) 变量上使用os.path.dirname,并使用os.path.join从相对于Python的路径构建绝对路径。脚本:

__file__

最后,由于联接的路径可以包含诸如script_dir = os.path.dirname(__file__) abs_src = os.path.join(script_dir, args.src) .之类的标记,因此您可以使用os.path.normpath“修饰”构建的路径:

..

答案 1 :(得分:1)

要添加到Tryph的答案中,可以在参数声明中指定type参数。它可以接受带有单个字符串参数并返回转换后值的任何可调用项:

parser.add_argument("-src",
                    required=True,
                    help="path to some folder",
                    type=os.path.abspath)

这将返回带有绝对路径的字符串,您也可以指定自己的函数:

def my_full_path(string):
    script_dir = os.path.dirname(__file__)
    return  os.path.normpath(os.path.join(script_dir, string))


parser = ArgumentParser()
parser.add_argument("-src",
                    required=True,
                    help="path to some folder",
                    type=my_full_path)