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

6

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

这是我的意思。

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",而不是完整路径"/home/username/projectname/folder"
因此,我一直在想是否有内置功能可以从相对路径获取完整路径?这个功能是否在Argparse中可用?

3
尝试使用 os.path.abspath(args.src)。该函数将返回参数 args.src 的绝对路径,使其更易于处理和使用。 - Yang HG
@user3051029,请看Alex的回答。关于你的问题,我认为它应该是被接受的答案。 - Tryph
@Tryph 当然可以,如果你不介意的话,我会更改已接受的答案。 - Denis
3个回答

10

在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)

8

编辑Alex的回答展示了如何通过简单填写add_argumenttype参数让argparse管理相对路径到绝对路径的转换。


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

abs_src = os.path.abspath(args.src)

请记住,这将通过将工作目录与相对路径连接起来生成绝对路径。因此,该路径被认为是相对于工作目录的。
如果您想将路径相对于脚本目录,您可以使用os.path.dirname__file__变量上,并使用os.path.join从相对于Python脚本的路径构建绝对路径:
script_dir = os.path.dirname(__file__)
abs_src = os.path.join(script_dir, args.src)

最后,由于连接的路径中可能包含诸如...之类的标记,您可以使用os.path.normpath“美化”您构建的路径:

abs_path = os.path.normpath(os.path.join(script_dir, args.src))

谢谢,这个函数在我的情况下运行得非常好。之前不知道有这个函数。 - Denis

0

我们的朋友pathlib难道不能简化这个过程吗?

from pathlib import Path

abs_path = Path(args.src.name).resolve()

abs_path现在是一个pathlib.PosixPath对象,但如果需要的话,它可以轻松转换为字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接