Estamos trabajando con un repositorio de código que se implementa en Windows y Linux, a veces en diferentes directorios. ¿Cómo debería uno de los módulos dentro del proyecto referirse a uno de los recursos que no son de Python en el proyecto (archivos CSV, etc.)?
Si hacemos algo como:
thefile=open('test.csv')
o:
thefile=open('../somedirectory/test.csv')
Solo funcionará cuando el script se ejecute desde un directorio específico o un subconjunto de directorios.
Lo que me gustaría hacer es algo como:
path=getBasePathOfProject()+'/somedirectory/test.csv'
thefile=open(path)
¿Es posible?
python
path
relative-path
olamundo
fuente
fuente
__file__
), '..', '..', 'resources')os.pardir
es ligeramente mejor que'..'
, aunque los dos son equivalentes tanto en POSIX como en Windows.Si está utilizando herramientas de configuración o distribuye (una instalación setup.py), la forma "correcta" de acceder a estos recursos empaquetados parece estar utilizando package_resources.
En su caso, el ejemplo sería
Lo que, por supuesto, lee el recurso y los datos binarios leídos serían el valor de my_data
Si solo necesita el nombre de archivo, también puede usar
Ejemplo:
La ventaja es que está garantizado que funcione incluso si se trata de una distribución de archivo como un huevo.
Ver http://packages.python.org/distribute/pkg_resources.html#resourcemanager-api
fuente
__file__
como en los viejos tiempos?En Python, las rutas son relativas al directorio de trabajo actual , que en la mayoría de los casos es el directorio desde el que ejecuta su programa. El directorio de trabajo actual es muy probable que no lo mismo que el directorio de su archivo de módulo, por lo que usar una ruta relativa al archivo de módulo actual es siempre una mala elección.
Usar la ruta absoluta debería ser la mejor solución:
fuente
A menudo uso algo similar a esto:
La variable
contiene el nombre del archivo de la secuencia de comandos en la que escribe ese código, por lo que puede hacer rutas relativas a la secuencia de comandos, pero aún escrito con rutas absolutas. Funciona bastante bien por varias razones:
Pero debe tener en cuenta la compatibilidad de la plataforma: os.pathsep de Windows es diferente de UNIX.
fuente
También intenta normalizar su
cwd
usoos.path.abspath(os.getcwd())
. Más información aquí .fuente
cwd
sin embargo, muy pocos casos de uso donde es la ruta de un móduloPuede usar la compilación en
__file__
variable. Contiene la ruta del archivo actual. Implementaría getBaseOfProject en un módulo en la raíz de su proyecto. Allí obtendría la parte del camino__file__
y la devolvería. Este método se puede usar en todas partes en su proyecto.fuente
Me quedé perplejo aquí un poco. Quería empaquetar algunos archivos de recursos en un archivo de rueda y acceder a ellos. Hizo el paquete usando el archivo de manifiesto, pero pip install no lo estaba instalando a menos que fuera un subdirectorio. Esperar que estos disparos de sceen ayuden
MANIFEST.in
Creó un weel usando setup.py estándar. pip instaló el archivo de la rueda. Después de la instalación se verifica si los recursos están instalados. Son
En tfclient.py para acceder a estos archivos. de
Y funciona.
fuente
Pasé mucho tiempo averiguando la respuesta a esto, pero finalmente lo obtuve (y en realidad es muy simple):
Esto agregará la ruta relativa de su subcarpeta a los directorios para que Python los vea. Es bastante rápido y sucio, pero funciona de maravilla :)
fuente
open('your/subfolder/of/choice')
todos modos.