Почему в этом случае os.path.join () не работает? - PullRequest
283 голосов
/ 22 декабря 2009

Приведенный ниже код не присоединится, когда при отладке команда сохраняет не весь путь, а только последнюю запись.

os.path.join('/home/build/test/sandboxes/', todaystr, '/new_sandbox/')

Когда я проверяю это, он сохраняет только часть кода /new_sandbox/.

Ответы [ 11 ]

381 голосов
/ 22 декабря 2009

Последние строки не должны начинаться с косой черты. Если они начинаются с косой черты, то они считаются «абсолютным путем», и все, что перед ними, отбрасывается.

Цитирование документов Python для os.path.join:

Если компонент является абсолютным путем, все предыдущие компоненты отбрасываются, и соединение продолжается с компонента абсолютного пути.

Обратите внимание на Windows, поведение по отношению к буквам дисков, которое, кажется, изменилось по сравнению с более ранними версиями Python:

В Windows буква диска не сбрасывается при обнаружении компонента абсолютного пути (например, r'\foo'). Если компонент содержит букву диска, все предыдущие компоненты отбрасываются и буква диска сбрасывается. Обратите внимание, что поскольку для каждого диска имеется текущий каталог, os.path.join("c:", "foo") представляет путь относительно текущего каталога на диске C: (c:foo), а не c:\foo.

141 голосов
/ 22 декабря 2009

Идея os.path.join() состоит в том, чтобы сделать вашу программу кроссплатформенной (linux / windows / etc).

Даже один слэш разрушает его.

Так что это имеет смысл только при использовании с какой-то контрольной точкой, такой как os.environ['HOME'] или os.path.dirname(__file__).

67 голосов
/ 19 февраля 2013

os.path.join() может использоваться вместе с os.path.sep для создания абсолютного, а не относительного пути.

os.path.join(os.path.sep, 'home','build','test','sandboxes',todaystr,'new_sandbox')
20 голосов
/ 22 декабря 2009

Не используйте прямые косые черты в начале компонентов пути, кроме случаев обращения к корневому каталогу:

os.path.join('/home/build/test/sandboxes', todaystr, 'new_sandbox')

см. Также: http://docs.python.org/library/os.path.html#os.path.join

16 голосов
/ 19 июня 2014

Чтобы понять, почему это удивительное поведение не полностью ужасно, рассмотрим приложение, которое принимает имя файла конфигурации в качестве аргумента:

config_root = "/etc/myapp.conf/"
file_name = os.path.join(config_root, sys.argv[1])

Если приложение выполняется с:

$ myapp foo.conf

Будет использоваться файл конфигурации /etc/myapp.conf/foo.conf.

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

$ myapp /some/path/bar.conf

Тогда myapp должен использовать файл конфигурации на /some/path/bar.conf (а не /etc/myapp.conf/some/path/bar.conf или аналогичный).

Это может быть не очень хорошо, но я считаю, что это мотивация поведения абсолютного пути.

11 голосов
/ 22 декабря 2009

Это потому, что ваш '/new_sandbox/' начинается с / и, следовательно, предполагается, что он относится к корневому каталогу. Удалить ведущий /.

8 голосов
/ 29 августа 2014

Чтобы сделать вашу функцию более переносимой, используйте ее следующим образом:

os.path.join(os.sep, 'home', 'build', 'test', 'sandboxes', todaystr, 'new_sandbox')

или

os.path.join(os.environ.get("HOME"), 'test', 'sandboxes', todaystr, 'new_sandbox')
6 голосов
/ 22 апреля 2018

Попробуйте комбинировать split("/") и * для строк с существующими объединениями.

import os

home = '/home/build/test/sandboxes/'
todaystr = '042118'
new = '/new_sandbox/'

os.path.join(*home.split("/"), todaystr, *new.split("/"))


Как это работает ...

split("/") превращает существующий путь в список: ['', 'home', 'build', 'test', 'sandboxes', '']

* перед списком выделяет каждый элемент списка своим собственным параметром

3 голосов
/ 22 декабря 2009

Попробуйте только с new_sandbox

os.path.join('/home/build/test/sandboxes/', todaystr, 'new_sandbox')
2 голосов
/ 22 декабря 2009

делай так, без лишних косых черт

root="/home"
os.path.join(root,"build","test","sandboxes",todaystr,"new_sandbox")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...