Относительные пути в Python


Answers

вам нужен os.path.realpath (пример ниже добавляет родительский каталог к ​​вашему пути)

import sys,os
sys.path.append(os.path.realpath('..'))
Question

Я создаю простой вспомогательный скрипт для работы, который скопирует пару файлов шаблонов в нашей базе кода в текущий каталог. Однако у меня нет абсолютного пути к каталогу, в котором хранятся шаблоны. У меня есть относительный путь от скрипта, но когда я вызываю скрипт, он рассматривает это как путь относительно текущего рабочего каталога. Есть ли способ указать, что этот относительный url находится из местоположения скрипта?




См. sys.path При инициализации при запуске программы первым элементом этого списка является путь [0], это каталог, содержащий скрипт, который использовался для вызова интерпретатора Python.

Используйте этот путь как корневую папку, из которой вы применяете свой относительный путь

>>> import sys
>>> import os.path
>>> sys.path[0]
'C:\\Python25\\Lib\\idlelib'
>>> os.path.relpath(sys.path[0], "path_to_libs") # if you have python 2.6
>>> os.path.join(sys.path[0], "path_to_libs")
'C:\\Python25\\Lib\\idlelib\\path_to_libs'



Для меня работала sys.path.insert . Затем я указал каталог, в котором мне нужно было идти. Например, мне просто нужно было перейти в один каталог.

import sys
sys.path.insert(0, '../')



Привет, прежде всего, вы должны понимать функции os.path.abspath (путь) и os.path.relpath (путь)

Короче os.path.abspath (path) делает относительный путь к абсолютному пути . И если предоставленный путь сам по себе является абсолютным путем, функция возвращает тот же путь.

аналогично os.path.relpath (path) делает абсолютный путь к относительному пути . И если предоставленный путь сам по себе является относительным путем, то функция возвращает тот же путь.

Ниже приведен пример, позволяющий правильно понимать приведенную выше концепцию :

предположим, что у меня есть файл input_file_list.txt, который содержит список входных файлов, которые будут обрабатываться моим скриптом python.

D: \ конц \ input1.dic

D: \ конц \ input2.dic

D: \ Copyioconc \ input_file_list.txt

Если вы видите выше структуру папок, input_file_list.txt присутствует в папке Copyofconc, и файлы, которые будут обрабатываться скриптом python, присутствуют в папке conc

Но содержимое файла input_file_list.txt выглядит так:

.. \ конц \ input1.dic

.. \ конц \ input2.dic

И мой скрипт python присутствует в диске D:.

И относительный путь, указанный в файле input_file_list.txt, относится к пути файла input_file_list.txt .

Поэтому, когда скрипт python должен выполнить текущий рабочий каталог (используйте os.getcwd (), чтобы получить путь)

Поскольку мой относительный путь относится к input_file_list.txt , то есть «D: \ Copyofconc» , мне нужно изменить текущий рабочий каталог на «D: \ Copyofconc» .

Поэтому мне нужно использовать os.chdir ('D: \ Copyofconc') , поэтому текущий рабочий каталог должен быть «D: \ Copyofconc» .

Теперь, чтобы получить файлы input1.dic и input2.dic , я прочитаю строки «.. \ conc \ input1.dic», затем будет использовать команду

input1_path = os.path.abspath ('.. \ conc \ input1.dic') (для изменения относительного пути к абсолютному пути. Здесь в качестве текущего рабочего каталога находится «D: \ Copyofconc», файл «. \ conc \ input1». dic "должны быть доступны относительно" D: \ Copyofconc ")

поэтому input1_path должен быть «D: \ conc \ input1.dic»




Вместо того, чтобы использовать

import os
dirname = os.path.dirname(__file__)
filename = os.path.join(dirname, 'relative/path/to/file/you/want')

как и в принятом ответе, было бы более надежно использовать:

import inspect
import os
dirname = os.path.dirname(os.path.abspath(inspect.stack()[0][1]))
filename = os.path.join(dirname, 'relative/path/to/file/you/want')

потому что использование __file__ вернет файл, из которого был загружен модуль, если он был загружен из файла, поэтому, если файл со сценарием вызывается из другого места, возвращаемый каталог будет неправильным.

Эти ответы дают более подробную информацию: https://.com/a/31867043/5542253 и https://.com/a/50502/5542253