example - python join path and filename
construyendo ruta absoluta con os.path.join() (5)
Así que puedes hacer una verificación para ejecutar os por sys.platfrom
en las ventanas
>>> sys.platform
''win32''
en linux
>>> sys.platform
''linux2''
entonces
if sys.platform == ''win32'':
ROOT = os.path.splitdrive(os.path.abspath(''.''))[0]
elif sys.platform == ''linux2'':
ROOT = os.sep
Tenga en cuenta que ''linux2'' puede no cubrir todas las distribuciones de linux
Me gustaría construir un camino absoluto en Python, mientras que al mismo tiempo me mantengo bastante inconsciente de cosas como separador de camino.
edit0: por ejemplo, hay un directorio en la raíz de mi sistema de archivos /etc/init.d
(o C:/etc/init.d
en w32), y quiero construir esto solo a partir de los elementos etc
y init.d
( en w32, probablemente también necesito una ID de disco, como C:
Para no tener que preocuparse por los separadores de ruta, os.join.path()
es obviamente la herramienta elegida. Pero parece que esto solo creará caminos relativos :
print "MYPATH:", os.path.join(''etc'', ''init.d'')
MYPATH: etc/init.d
Agregar un primer elemento ficticio (por ejemplo, ''''
) no ayuda en nada:
print "MYPATH:", os.path.join('''', ''etc'', ''init.d'')
MYPATH: etc/init.d
Hacer que el primer elemento sea absoluto, obviamente ayuda, pero este tipo de derrota a la idea de usar os.path.join()
print "MYPATH:", os.path.join(''/etc'', ''init.d'')
MYPATH: /etc/init.d
edit1: usar os.path.abspath()
solo intentará convertir una ruta relativa en una ruta absoluta. Por ejemplo, considere ejecutar lo siguiente en el directorio de trabajo /home/foo
:
print "MYPATH:", os.path.abspath(os.path.join(''etc'', ''init.d''))
MYPATH: /home/foo/etc/init.d
Entonces, ¿cuál es la forma estándar multiplataforma para "rootear" una ruta?
root = ??? # <--
print "MYPATH:", os.path.join(root, ''etc'', ''init.d'')
MYPATH: /etc/init.d
edit2: la pregunta realmente se reduce a: dado que la barra diagonal principal en /etc/init.d
hace que esta ruta sea una ruta absoluta, ¿hay una manera de construir esta barra diagonal programática? (No quiero hacer suposiciones de que una barra diagonal indica una ruta absoluta)
Creo que puedes usar os.path.normpath
. Esto es lo que obtengo en Windows:
>>> os.path.normpath("/etc/init.d")
''//etc//init.d''
No estoy seguro de qué es exactamente lo que se debe hacer con el prefijo de la unidad, pero creo que dejarlo significa algo así como "sigue usando la unidad en la que estoy ahora", que es probablemente lo que quieres. Tal vez alguien más familiarizado con Windows puede aclarar?
Usando os.sep
como root funcionó para mí:
path.join(os.sep, ''python'', ''bin'')
Linux: /python/bin
Windows: /python/bin
Agregar path.abspath()
a la mezcla también le dará letras de unidad en Windows y aún es compatible con Linux:
path.abspath(path.join(os.sep, ''python'', ''bin''))
Linux: /python/bin
Windows: C:/python/bin
así que la solución que se me ocurrió es construir la raíz del sistema de archivos siguiendo un archivo dado a su raíz:
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'')
puede probar con os.path.splitdrive
para obtener el nombre de su unidad / sistema de archivos, y luego unir esto con su cadena de caracteres.
http://docs.python.org/2/library/os.path.html#os.path.splitdrive
algo así (sin probar!)
(drive, tail) = os.path.splitdrive(os.getcwd())
os.path.join(drive, ''foo'')
debe hacer el truco