построение абсолютного пути с помощью os.path.join ()

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

edit0: например, есть каталог в корне моей файловой системы /etc/init.d (или C:\etc\init.d init.d на w32), и я хочу построить это только из элементов и etc и init.d ( на w32, мне, вероятно, также нужен идентификатор диска, например C: 🙂

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

  • Для чего полезен __path__?
  • установить pythonpath перед операциями импорта
  • Зачем использовать sys.path.append (путь) вместо sys.path.insert (1, path)?
  • Импорт модулей из родительской папки
  • как найти полный (абсолютный путь) целевого файла символической ссылки или софт-ссылки в python
  • Относительные и абсолютные пути всех файлов
  • 5 Solutions collect form web for “построение абсолютного пути с помощью os.path.join ()”

    Использование 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

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

     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') 

    Таким образом, вы можете сделать чек для запуска os 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

    Я думаю, вы можете использовать os.path.normpath . Вот что я получаю в Windows:

     >>> os.path.normpath("/etc/init.d") '\\etc\\init.d' 

    Я не уверен, что правильная вещь с префиксом привода есть, но я думаю, что отказ от этого означает что-то вроде «продолжайте использовать диск, на котором я сейчас», что, вероятно, вы хотите. Может быть, кто-то более знакомый с Windows может прояснить?

    вы можете попробовать с os.path.splitdrive получить имя вашего диска / файловой системы, а затем присоединиться к этому с помощью вашей строки foo .

    http://docs.python.org/2/library/os.path.html#os.path.splitdrive

    что-то вроде (непроверенный!)

     (drive, tail) = os.path.splitdrive(os.getcwd()) os.path.join(drive, 'foo') 

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

    Python - лучший язык программирования в мире.