2010-12-07 28 views
13

La documentación para el módulo OS no parece tener información sobre cómo abrir un archivo que no está en un subdirectorio o el directorio actual en el que se ejecuta el script sin un ruta completa. Mi estructura de directorio se ve así.Módulo Python os archivo abierto sobre el directorio actual con ruta relativa

/home/matt/project/dir1/cgi-bin/script.py 
/home/matt/project/fileIwantToOpen.txt 

open("../../fileIwantToOpen.txt","r") 

Da un error de archivo no encontrado. Pero si inicio un intérprete de Python en el directorio cgi-bin y pruebo open("../../fileIwantToOpen.txt","r"), funciona. No quiero el código difícil en la ruta completa por razones obvias de portabilidad. ¿Hay un conjunto de métodos en el módulo del sistema operativo que CAN hacer esto?

+0

Hmm. Esto podría ser un error de permisos, o el directorio de trabajo para el CGI podría no ser el mismo que el de su intérprete de Python. El mensaje de error exacto podría ayudar. Además, en su CGI, intente 'print os.getcwd()' y vea lo que dice. –

+0

¿Se está ejecutando la secuencia de comandos CGI en una cárcel chroot? Si es así, entonces esto no funcionará, ya que no puede escapar de la cárcel. –

+0

@ Adam Rosenfield no. @Jason literalmente ejecuto el intérprete de Python en el directorio cgi-bin, así que no entiendo cómo funcionaría en ese y no dentro del script que se ejecuta en el directorio cgi-bin. –

Respuesta

33

La ruta dada a open debe ser relativa al directorio de trabajo actual, el directorio desde el que ejecuta el script. Entonces, el ejemplo anterior solo funcionará si lo ejecuta desde el directorio cgi-bin.

Una solución simple sería hacer su ruta relativa a la secuencia de comandos. Una posible solución.

from os import path 

basepath = path.dirname(__file__) 
filepath = path.abspath(path.join(basepath, "..", "..", "fileIwantToOpen.txt")) 
f = open(filepath, "r") 

De esta manera obtendrá la ruta del script que se está ejecutando (ruta base) y se une a que con la ruta relativa del archivo que desea abrir. os.path se ocupará de los detalles de unir las dos rutas.

+0

Este comando me acaba de dar ../../fileIwantToOpen.txt como la ruta de acceso y todavía no puede encontrarlo . –

+0

Este lo probé y parece funcionar bien. – terminus

+0

@terminus: 'basepath = os.path.dirname (sys.argv [0])', y 'os.path.join (basepath, '..', '..', 'fileIwantToOpen.txt')'. También usaría '__file__' en lugar de' sys.argv [0] '. –

3

Esto debe moverse en el directorio donde se encuentra el guión, si no está ya:

file_path = os.path.dirname(__file__) 
if file_path != "": 
    os.chdir(file_path) 
open("../../fileIwantToOpen.txt","r") 
Cuestiones relacionadas