membangun path absolut dengan os.jalan.join()

I'd seperti untuk membangun path absolut di python, sementara pada saat yang sama tinggal cukup menyadari hal-hal seperti jalur pemisah.

edit0: untuk contoh ada pada direktori root dari saya filesystem /etc/init.d (atau C:\etc\init.d pada w32), dan saya ingin membangun ini hanya dari unsur-unsur dll dan init.d (pada w32, mungkin saya juga perlu disk-ID, seperti C:)

Dalam rangka untuk tidak harus khawatir tentang jalan-pemisah, os.bergabung.path() jelas alat pilihan. Tapi tampaknya bahwa ini hanya akan membuat relatif jalan:

 print "MYPATH:", os.path.join('etc', 'init.d')
 MYPATH: etc/init.d

Menambahkan dummy pertama-elemen (misalnya'') doesn't membantu apa-apa:

 print "MYPATH:", os.path.join('', 'etc', 'init.d')
 MYPATH: etc/init.d

Membuat elemen pertama mutlak jelas membantu, tapi ini semacam dari kekalahan ide untuk menggunakan os.jalan.join()

 print "MYPATH:", os.path.join('/etc', 'init.d')
 MYPATH: /etc/init.d

edit1: menggunakan os.jalan.abspath() hanya akan mencoba untuk mengubah path relatif ke path absolut. misalnya, mempertimbangkan menjalankan berikut di direktori /home/foo:

 print "MYPATH:", os.path.abspath(os.path.join('etc', 'init.d'))
 MYPATH: /home/foo/etc/init.d

Jadi, apa adalah standar cross-platform cara untuk "root" jalan?

 root = ??? # <--
 print "MYPATH:", os.path.join(root, 'etc', 'init.d')
 MYPATH: /etc/init.d

edit2: pertanyaan yang benar-benar bermuara ke: sejak slash terkemuka di /etc/init.d membuat jalan ini path absolut, apakah ada cara untuk membangun terkemuka ini slash pemrograman? (Saya tidak ingin membuat asumsi-asumsi yang terkemuka slash menunjukkan path absolut)

Mengomentari pertanyaan (3)

Menggunakan os.sep sebagai akar bekerja untuk saya:

path.join(os.sep, 'python', 'bin')

Linux: /python/bin

Windows: \python\bin

Menambahkan path.abspath() untuk campuran akan memberikan huruf drive pada Windows juga dan masih kompatibel dengan Linux:

path.abspath(path.join(os.sep, 'python', 'bin'))

Linux: /python/bin

Windows: C:\python\bin

Komentar (1)

Saya pikir anda dapat menggunakan os.jalan.normpath. Berikut ini's apa yang saya dapatkan pada Windows:

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

I'm tidak yakin persis apa hal yang tepat untuk dilakukan dengan drive awalan, tapi saya pikir meninggalkannya berarti sesuatu seperti "tetap menggunakan drive I'm sekarang," yang mungkin adalah apa yang anda inginkan. Mungkin orang lebih familiar dengan Windows bisa menjelaskan?

Komentar (2)
Larutan

jadi solusinya saya datang dengan adalah untuk membangun akar sistem berkas dengan mengikuti file yang diberikan untuk itu's 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')
Komentar (5)

Agar anda dapat melakukan check untuk menjalankan os oleh sys.platfrom

pada windows

>>> sys.platform
'win32'

pada linux

>>> sys.platform
'linux2'

kemudian

if sys.platform == 'win32':
    ROOT = os.path.splitdrive(os.path.abspath('.'))[0]
elif sys.platform == 'linux2':
    ROOT = os.sep

Harap dicatat bahwa 'linux2' mungkin tidak mencakup semua distro linux

Komentar (10)

anda bisa mencoba dengan os.jalan.splitdrive untuk mendapatkan nama drive/filesystem, maka bergabung dengan anda foo string.

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

sesuatu seperti (belum teruji!)

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

harus melakukan trik.

Komentar (1)