Получение полного пути от относительного пути с Argparse - PullRequest
1 голос
/ 20 марта 2019

Я пишу небольшую утилиту командной строки для своего скрипта и не могу понять, как правильно получить полный путь из аргумента.

Вот что я имею в виду.

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, которая позволяет получить полный путь от относительного пути?

Ответы [ 2 ]

5 голосов
/ 20 марта 2019

РЕДАКТИРОВАТЬ : в ответе Алекса показано, как заставить argparse управлять преобразованием относительных в абсолютные значения путем простого заполнения параметра add_argument * type.


Я не думаю, что 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))
1 голос
/ 20 марта 2019

Чтобы добавить ответ Трифа, вы можете указать параметр 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)
...