python-3.x 使用Argparse从相对路径获取完整路径

bwntbbo3  于 2023-05-30  发布在  Python
关注(0)|答案(3)|浏览(163)

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

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中是否有某种内置的功能,允许从相对路径中获取完整路径?

wkyowqbh

wkyowqbh1#

要添加到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)
iovurdzv

iovurdzv2#

EDITAlex's answer演示了如何通过填写add_argumenttype参数,让argparse管理相对到绝对路径转换。

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

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

请记住,这将通过将工作目录与相对路径连接起来来创建绝对路径。因此,路径被认为是相对于工作目录的。
如果你想让路径相对于脚本目录,你可以在__file__变量上使用os.path.dirname,然后使用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))
5m1hhzi4

5m1hhzi43#

难道我们的朋友pathlib不会简化这个问题吗?

from pathlib import Path

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

abs_path现在是一个pathlib.PosixPath对象,但是如果需要的话,它很容易转换为字符串。

相关问题