Я создаю простой вспомогательный скрипт для работы, который скопирует пару файлов шаблонов из нашей базы кода в текущий каталог. Однако у меня нет абсолютного пути к каталогу, в котором хранятся шаблоны. У меня есть относительный путь от сценария, но когда я вызываю сценарий, он обрабатывает его как путь относительно текущего рабочего каталога. Есть ли способ указать, что этот относительный URL-адрес от расположения сценария вместо этого?
python
relative-path
path
baudtack
источник
источник
Ответы:
В файле со сценарием вы хотите сделать что-то вроде этого:
Это даст вам абсолютный путь к файлу, который вы ищете. Обратите внимание, что если вы используете setuptools, вам, вероятно, следует вместо этого использовать его API ресурсов пакета .
ОБНОВЛЕНИЕ : я отвечаю на комментарий здесь, чтобы я мог вставить пример кода. :-)
Я предполагаю, что вы имеете в виду
__main__
сценарий, когда упоминаете о запуске файла напрямую. Если так, то в моей системе это не так (python 2.5.1 в OS X 10.5.7):Тем не менее, я знаю, что есть некоторые причуды с
__file__
расширениями Си. Например, я могу сделать это на моем Mac:Тем не менее, это вызывает исключение на моем компьютере с Windows.
источник
filename = os.path.join(dir, 'relative', 'path', 'to', 'file', 'you' , 'want')
os.path.dirname(__file__)
можете дать пустую строку, используйтеos.path.dirname(os.path.abspath(__file__))
вместовам нужно
os.path.realpath
(пример ниже добавляет родительский каталог к вашему пути)источник
os.path.dirname(__file__)
дал мне пустую строку. Это сработало отлично.os.path.realpath('..')
дает вам родительский каталог текущего рабочего каталога . Обычно это не то, что вы хотите.Как указано в принятом ответе
Я просто хочу добавить, что
Это должно быть что-то вроде
Принятый ответ может вводить в заблуждение в некоторых случаях, пожалуйста, обратитесь к этой ссылке для деталей
источник
os.path.join
лучше использовать, потому что он объединяет их с разделителем для конкретной ОС.'/relative/path...'
это не относительный путь. Это намеренно?os.path.join()
. Осталось только использовать отдельные строки для каждого элемента пути, а не жестко кодировать разделитель пути.Сейчас 2018 год, и Python уже давно эволюционировал
__future__
. Так как об использовании удивительногоpathlib
приходит с Python 3.4 , чтобы выполнить задачу , вместо того , чтобы бороться сos
,os.path
,glob
,shutil
и т.д.Итак, у нас есть 3 пути (возможно, дублированные):
mod_path
: это путь простого вспомогательного скриптаsrc_path
: который содержит пару файлов шаблонов, ожидающих копирования.cwd
: текущий каталог , место назначения этих файлов шаблонов.и проблема в том, что: у нас нет полного пути
src_path
, мы только знаем, что это относительный путь кmod_path
.Теперь давайте решим это с помощью удивительного
pathlib
:В будущем все просто. : D
Кроме того, мы можем выбрать и проверить и скопировать / переместить эти файлы шаблона с помощью
pathlib
:источник
Рассмотрим мой код:
источник
Смотрите sys.path Инициализированный при запуске программы, первый элемент этого списка, path [0], является каталогом, содержащим скрипт, который использовался для вызова интерпретатора Python.
Используйте этот путь в качестве корневой папки, из которой вы применяете свой относительный путь
источник
sys.path[0]
не всегда установлен родительский каталог. Python код может быть вызван с-c
или-m
или через встроенный интерпретатор, в котором точкаsys.path[0]
установлена на что - то другое в целом.Вместо того, чтобы использовать
как и в принятом ответе, было бы более надежно использовать:
потому что использование __file__ вернет файл, из которого был загружен модуль, если он был загружен из файла, поэтому, если файл со сценарием вызывается из другого места, возвращенный каталог будет неправильным.
Эти ответы дают более подробную информацию: https://stackoverflow.com/a/31867043/5542253 и https://stackoverflow.com/a/50502/5542253
источник
inspect.stack()
это дорогая функция для вызова. Он извлекает информацию для всех кадров стека, которые вы затем отбрасываете и получаете только верхний. Это в основном вызываетinspect.getfile()
объект модуля, который просто возвращаетmodule.__file__
. Вы гораздо лучше просто использовать__file__
.Привет, прежде всего вы должны понимать функции os.path.abspath (путь) и os.path.relpath (путь)
Короче говоря os.path.abspath (путь) делает относительный путь к абсолютному пути . И если указанный путь сам по себе является абсолютным, функция возвращает тот же путь.
аналогично os.path.relpath (путь) делает абсолютный путь к относительному пути . И если указанный путь является относительным, то функция возвращает тот же путь.
Приведенный ниже пример может помочь вам правильно понять вышеуказанную концепцию :
Предположим, у меня есть файл 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"
источник
Этот код вернет абсолютный путь к основному сценарию.
Это будет работать даже в модуле.
источник
sys.modules['__main__'].__file__
.Альтернатива, которая работает для меня:
источник
То, что работает для меня, использует
sys.path.insert
. Затем я указал каталог, который мне нужен. Например, мне просто нужно было перейти на один каталог.источник
Я не уверен, относится ли это к некоторым более старым версиям, но я считаю, что Python 3.3 имеет встроенную поддержку относительного пути.
Например, следующий код должен создать текстовый файл в той же папке, что и скрипт python:
(обратите внимание, что в начале не должно быть прямой или обратной косой черты, если это относительный путь)
источник