Построение абсолютного пути с помощью os.path.join()
Я хотел бы построить абсолютный путь в python, и в то же время оставаясь не обращая внимания на такие вещи, как разделитель путей.
edit0:, например, есть каталог в корне моей файловой системы /etc/init.d
(или C:\etc\init.d
на w32), и я хочу построить это только из элементов etc
и init.d
(на w32, вероятно, мне также нужен идентификатор диска, например C:
)
Чтобы не беспокоиться о разделителях путей, os.join.path()
, очевидно, является инструментом выбора. Но кажется, что это только создаст относительные пути:
print "MYPATH:", os.path.join('etc', 'init.d')
MYPATH: etc/init.d
Добавление фиктивного первого элемента (например, ''
) ничего не помогает:
print "MYPATH:", os.path.join('', 'etc', 'init.d')
MYPATH: etc/init.d
Создание первого элемента абсолютно очевидно помогает, но этот вид побеждает идею использования os.path.join()
print "MYPATH:", os.path.join('/etc', 'init.d')
MYPATH: /etc/init.d
edit1: с помощью os.path.abspath()
будет пытаться преобразовать относительный путь в абсолютный путь.
например запустите в рабочем каталоге /home/foo
следующее:
print "MYPATH:", os.path.abspath(os.path.join('etc', 'init.d'))
MYPATH: /home/foo/etc/init.d
Итак, каков стандартный кросс-платформенный способ "root" пути?
root = ??? # <--
print "MYPATH:", os.path.join(root, 'etc', 'init.d')
MYPATH: /etc/init.d
edit2: вопрос действительно сводится к следующему: поскольку конечная косая черта в /etc/init.d
делает этот путь абсолютным путем, существует ли способ создать эту конечную косую черту программно?
(Я не хочу делать предположения, что конечная косая черта указывает абсолютный путь)
Ответы
Ответ 1
поэтому решение, с которым я столкнулся, состоит в том, чтобы построить корень файловой системы, выполнив заданный файл root:
def getRoot(file=None):
if file is None:
file='.'
me=os.path.abspath(file)
drive,path=os.path.splitdrive(me)
while 1:
path,folder=os.path.split(path)
if not folder:
break
return drive+path
os.path.join(getRoot(), 'etc', 'init.d')
Ответ 2
Используя os.sep
, поскольку root работал у меня:
path.join(os.sep, 'python', 'bin')
Linux: /python/bin
Windows: \python\bin
Добавление path.abspath()
в микс также даст вам буквы дисков в Windows и по-прежнему совместимы с Linux:
path.abspath(path.join(os.sep, 'python', 'bin'))
Linux: /python/bin
Windows: C:\python\bin
Ответ 3
Итак, вы можете сделать чек для запуска os
by sys.platfrom
в окнах
>>> sys.platform
'win32'
в linux
>>> sys.platform
'linux2'
то
if sys.platform == 'win32':
ROOT = os.path.splitdrive(os.path.abspath('.'))[0]
elif sys.platform == 'linux2':
ROOT = os.sep
Обратите внимание, что "linux2" может не охватывать все дистрибутивы Linux
Ответ 4
Я думаю, вы можете использовать os.path.normpath
. Вот что я получаю в Windows:
>>> os.path.normpath("/etc/init.d")
'\\etc\\init.d'
Я не уверен, что правильно делать с префиксом диска, но я думаю, что оставить его значит что-то вроде "продолжайте использовать диск, на котором я сейчас", что, вероятно, то, что вы хотите. Может быть, кто-то более знакомый с Windows может уточнить?
Ответ 5
вы можете попробовать с помощью os.path.splitdrive
получить имя вашего диска/файловой системы, а затем присоединить его к вашей строке foo
.
http://docs.python.org/2/library/os.path.html#os.path.splitdrive
что-то вроде (untested!)
(drive, tail) = os.path.splitdrive(os.getcwd())
os.path.join(drive, 'foo')
должен сделать трюк.