Подтвердить что ты не робот

Построение абсолютного пути с помощью 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 делает этот путь абсолютным путем, существует ли способ создать эту конечную косую черту программно? (Я не хочу делать предположения, что конечная косая черта указывает абсолютный путь)

4b9b3361

Ответ 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')

должен сделать трюк.