Я'd, как построить абсолютный путь в Python, и в то же время оставаясь достаточно забывать о таких вещах, как путь-сепаратор.
edit0: например, есть каталог на корень моей файловой системы из/etc/инит.Д(или
C:\etc\init.d на этот W32), и я хочу, чтобы построить этот единственный из элементов и т. д.
и инит.д
(О с W32, я, наверное, тоже нужен диск-ИД, как C:
)
Для того, чтобы не беспокоясь о пути-сепараторы, ОС.присоединяйтесь.путь ()
, очевидно, является инструментом выбора. Но мне кажется, что это будет только когда-нибудь создать относительная пути:
print "MYPATH:", os.path.join('etc', 'init.d')
MYPATH: etc/init.d
Добавление фиктивного первого элемента (напр.''
) Не'т помочь, чем угодно:
print "MYPATH:", os.path.join('', 'etc', 'init.d')
MYPATH: etc/init.d
Делая первый элемент абсолютной явно помогает, Но этот вид поражений идею использования ОС.путь.присоединяйтесь к()`
print "MYPATH:", os.path.join('/etc', 'init.d')
MYPATH: /etc/init.d
edit1: с помощью ОС.путь.abspath () будет только попытаться преобразовать относительный путь в абсолютный путь.
например, попробуйте выполнить следующие действия в рабочую директорию /дома/Foo
:
print "MYPATH:", os.path.abspath(os.path.join('etc', 'init.d'))
MYPATH: /home/foo/etc/init.d
Итак, каков стандартный кросс-платформенный способ, чтобы "корень" по пути?
root = ??? # <--
print "MYPATH:", os.path.join(root, 'etc', 'init.d')
MYPATH: /etc/init.d
edit2: вопрос на самом деле сводится к тому: после косой черты в /etc/инит.Д
делает этот путь абсолютный путь, есть ли способ, чтобы построить этот Слэш программно?
(Я не хочу делать предположения, что ведущая черта указывает абсолютный путь)
С помощью операционной системы.сентября как корень работал для меня:
path.join(os.sep, 'python', 'bin')
Линукс: /питон/бин
Окна: \питона\бин
Добавление пути.abspath()` в смесь даст вам букву диска в Windows и по-прежнему совместима с Linux:
path.abspath(path.join(os.sep, 'python', 'bin'))
Линукс: /питон/бин
Окна: C:\python\bin
Я думаю, что вы можете использовать ОС.путь.normpath
. Здесь's то, что я получаю на Windows:
>>> os.path.normpath("/etc/init.d")
'\\etc\\init.d'
Я'м не уверен точно, что правильно делать с приводом префикс, но я думаю, что оставив его, означает что-то вроде "и продолжать использовать диск, Я'м на сейчас, и" что это, наверное, то, что вы хотите. Может быть, кто-нибудь более знакомый с Windows, можно уточнить?
поэтому решение, которое я придумал, заключается в построении корневой файловой системы, выполнив данный файл, чтобы он'корней:
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')
Так что вы можете сделать чек на ОС функция sys.кроссплатформенность
на Windows
>>> 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
вы могли бы попробовать с ОС.путь.splitdrive, чтобы получить имя вашего диска/файловой системы, то вступите в эту строку ваше
фу`.
http://docs.python.org/2/library/os.path.html#os.path.splitdrive
что-то вроде (непроверенных!)
(drive, tail) = os.path.splitdrive(os.getcwd())
os.path.join(drive, 'foo')
следует сделать трюк.