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