Estoy creando un script de ayuda simple para el trabajo que copiará un par de archivos de plantilla en nuestra base de código al directorio actual. Sin embargo, no tengo la ruta absoluta al directorio donde se almacenan las plantillas. Tengo una ruta relativa desde el script pero cuando llamo al script lo trata como una ruta relativa al directorio de trabajo actual. ¿Hay alguna manera de especificar que esta url relativa es de la ubicación del script?
python
relative-path
path
baudtack
fuente
fuente
Respuestas:
En el archivo que tiene el script, desea hacer algo como esto:
Esto le dará la ruta absoluta al archivo que está buscando. Tenga en cuenta que si está usando setuptools, probablemente debería usar su API de recursos de paquete en su lugar.
ACTUALIZACIÓN : estoy respondiendo a un comentario aquí para poder pegar una muestra de código. :-)
Supongo que te refieres al
__main__
script cuando mencionas ejecutar el archivo directamente. Si es así, ese no parece ser el caso en mi sistema (python 2.5.1 en OS X 10.5.7):Sin embargo, sé que hay algunas peculiaridades con las
__file__
extensiones C. Por ejemplo, puedo hacer esto en mi Mac:Sin embargo, esto genera una excepción en mi máquina Windows.
fuente
filename = os.path.join(dir, 'relative', 'path', 'to', 'file', 'you' , 'want')
os.path.dirname(__file__)
puede dar una cadena vacía, usaros.path.dirname(os.path.abspath(__file__))
en su lugarque necesita
os.path.realpath
(el ejemplo a continuación agrega el directorio principal a su ruta)fuente
os.path.dirname(__file__)
me dio una cuerda vacía. Esto funcionó perfectamente.os.path.realpath('..')
le da el directorio padre del directorio de trabajo actual . Eso generalmente no es lo que quieres.Como se menciona en la respuesta aceptada
Solo quiero agregar eso
Debería ser algo como
La respuesta aceptada puede ser engañosa en algunos casos, consulte este enlace para obtener más detalles.
fuente
os.path.join
es mejor porque los une con el separador específico del sistema operativo.'/relative/path...'
No es un camino relativo. ¿Es eso intencional?os.path.join()
. Lo que queda es la preferencia de usar cadenas separadas para cada elemento de ruta en lugar de codificar el separador de ruta.Ahora es 2018, y Python ya ha evolucionado
__future__
hace mucho tiempo. Entonces, ¿cómo sobre el uso de la sorprendentepathlib
viene con Python 3.4 para realizar la tarea en lugar de luchar conos
,os.path
,glob
,shutil
, etc.Entonces tenemos 3 caminos aquí (posiblemente duplicados):
mod_path
: cuál es la ruta del script de ayuda simplesrc_path
: que contiene un par de archivos de plantilla que esperan ser copiados.cwd
: directorio actual , el destino de esos archivos de plantilla.y el problema es: no tenemos la ruta completa de
src_path
, solo sabemos que es la ruta relativa a lamod_path
.Ahora solucionemos esto con lo sorprendente
pathlib
:En el futuro, es así de simple. :RE
Además, podemos seleccionar y verificar y copiar / mover esos archivos de plantilla con
pathlib
:fuente
Considera mi código:
fuente
Ver sys.path Como se inicializó al iniciar el programa, el primer elemento de esta lista, ruta [0], es el directorio que contiene el script que se utilizó para invocar al intérprete de Python.
Use esta ruta como la carpeta raíz desde la que aplica su ruta relativa
fuente
sys.path[0]
no siempre se establece en el directorio principal. El código de Python se puede invocar con-c
o a-m
través de un intérprete incrustado, en cuyo puntosys.path[0]
se establece algo completamente diferente.En lugar de usar
como en la respuesta aceptada, sería más robusto usar:
porque usar __file__ devolverá el archivo desde el que se cargó el módulo, si se cargó desde un archivo, por lo que si el archivo con el script se llama desde otro lugar, el directorio devuelto no será correcto.
Estas respuestas dan más detalles: https://stackoverflow.com/a/31867043/5542253 y https://stackoverflow.com/a/50502/5542253
fuente
inspect.stack()
Es una función costosa para llamar. Recupera información para todos los marcos de pila, que luego descartas y solo obtienes el superior. Básicamente llamainspect.getfile()
al objeto del módulo, que simplemente regresamodule.__file__
. Eres mucho mejor de solo usarlo__file__
.Hola, en primer lugar, debe comprender las funciones os.path.abspath (ruta) y os.path.relpath (ruta)
En resumen, os.path.abspath (ruta) crea una ruta relativa a la ruta absoluta . Y si la ruta proporcionada es en sí misma una ruta absoluta, entonces la función devuelve la misma ruta.
Del mismo modo os.path.relpath (ruta de acceso) realiza una ruta absoluta a ruta relativa . Y si la ruta proporcionada es en sí misma una ruta relativa, la función devuelve la misma ruta.
El siguiente ejemplo puede permitirle comprender el concepto anterior correctamente :
supongamos que tengo un archivo input_file_list.txt que contiene una lista de archivos de entrada para ser procesados por mi script de Python.
D: \ conc \ input1.dic
D: \ conc \ input2.dic
D: \ Copyioconc \ input_file_list.txt
Si ve la estructura de carpetas anterior, input_file_list.txt está presente en la carpeta Copyofconc y los archivos que procesará el script de Python están presentes en la carpeta conc
Pero el contenido del archivo input_file_list.txt es el que se muestra a continuación:
.. \ conc \ input1.dic
.. \ conc \ input2.dic
Y mi script de Python está presente en D: drive.
Y la ruta relativa proporcionada en el archivo input_file_list.txt es relativa a la ruta del archivo input_file_list.txt .
Entonces, cuando el script python ejecutará el directorio de trabajo actual (use os.getcwd () para obtener la ruta)
Como mi ruta relativa es relativa a input_file_list.txt , es decir "D: \ Copyofconc" , tengo que cambiar el directorio de trabajo actual a "D: \ Copyofconc" .
Así que tengo que usar os.chdir ('D: \ Copyofconc') , por lo que el directorio de trabajo actual será "D: \ Copyofconc" .
Ahora para obtener los archivos input1.dic y input2.dic , leeré las líneas ".. \ conc \ input1.dic" y luego usaré el comando
input1_path = os.path.abspath ('.. \ conc \ input1.dic') (para cambiar la ruta relativa a la ruta absoluta. Aquí, como directorio de trabajo actual es "D: \ Copyofconc", el archivo ". \ conc \ input1. Dic "se accederá en relación con" D: \ Copyofconc ")
entonces input1_path será "D: \ conc \ input1.dic"
fuente
Este código devolverá la ruta absoluta al script principal.
Esto funcionará incluso en un módulo.
fuente
sys.modules['__main__'].__file__
.Una alternativa que funciona para mí:
fuente
Lo que funcionó para mí está usando
sys.path.insert
. Luego especifiqué el directorio que necesitaba ir. Por ejemplo, solo necesitaba subir un directorio.fuente
No estoy seguro de si esto se aplica a algunas de las versiones anteriores, pero creo que Python 3.3 tiene soporte de ruta relativa nativa.
Por ejemplo, el siguiente código debería crear un archivo de texto en la misma carpeta que el script python:
(tenga en cuenta que no debería haber una barra invertida o una barra invertida al principio si se trata de una ruta relativa)
fuente