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

use*_*029 2 python argparse python-3.x

我正在为脚本编写一个小的命令行实用程序,但无法弄清楚如何从参数中正确获取完整路径。

这就是我的意思。

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

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

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

因此,我一直想知道是否存在某种内置功能Argparse,可以从相对路径获取完整路径?

Try*_*yph 6

编辑亚历克斯的答案显示了如何argparse通过简单地填充add_argumenttype参数来进行相对路径到绝对路径的管理。


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

abs_src = os.path.abspath(args.src)
Run Code Online (Sandbox Code Playgroud)

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


如果你想相对于脚本目录的路径做,你可以使用os.path.dirname__file__变量,os.path.join从相对于你的Python脚本的路径建立一个绝对路径:

script_dir = os.path.dirname(__file__)
abs_src = os.path.join(script_dir, args.src)
Run Code Online (Sandbox Code Playgroud)

最后,由于联接路径可以包含诸如.和的标记..,因此您可以使用os.path.normpath “修饰”构建的路径:

abs_path = os.path.normpath(os.path.join(script_dir, args.src))
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 5

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

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

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

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)
Run Code Online (Sandbox Code Playgroud)