2010-12-07 34 views
13

La documentation du module OS ne semble pas contenir d'informations sur l'ouverture d'un fichier qui ne se trouve pas dans un sous-répertoire ou le répertoire courant dans lequel le script s'exécute sans chemin complet. Ma structure de répertoire ressemble à ceci.Python os module ouvre le fichier au-dessus du répertoire actuel avec le chemin relatif

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

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

enregistre les fichiers non trouvé erreur. Mais si je lance un interpréteur python dans le répertoire cgi-bin et que j'essaie open("../../fileIwantToOpen.txt","r") cela fonctionne. Je ne veux pas coder en dur dans le chemin complet pour des raisons évidentes de portabilité. Existe-t-il un ensemble de méthodes dans le module OS que CAN font cela?

+0

Hmm. Cela peut être une erreur d'autorisation, ou le répertoire de travail pour le CGI peut ne pas être le même que votre interpréteur Python. Le message d'erreur exact pourrait aider. De même, dans votre CGI, essayez 'print os.getcwd()' et voyez ce que cela signifie. –

+0

Votre script CGI s'exécute-t-il dans une prison chroot? Si c'est le cas, cela ne fonctionnera pas puisque vous ne pouvez pas échapper à la prison. –

+0

@ Adam Rosenfield no. @Jason Je lance littéralement l'interpréteur python dans le répertoire cgi-bin, donc je ne comprends pas comment cela fonctionnerait dans celui-là et pas dans le script qui tourne dans le répertoire cgi-bin. –

Répondre

33

Le chemin attribué à open doit être relatif au répertoire de travail en cours, le répertoire à partir duquel vous exécutez le script. L'exemple ci-dessus ne fonctionnera donc que si vous l'exécutez depuis le répertoire cgi-bin.

Une solution simple serait de faire votre chemin par rapport au script. Une solution possible

from os import path 

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

De cette façon, vous obtiendrez le chemin du script que vous utilisez (basePath) et le joindre à ce chemin relatif du fichier que vous souhaitez ouvrir. os.path prendra soin des détails de rejoindre les deux voies.

+0

cette commande me donne juste ../../fileIwantToOpen.txt comme le chemin et il ne peut toujours pas le trouver . –

+0

Celui-ci j'ai essayé et semble fonctionner correctement. – terminus

+0

@terminus: 'basepath = os.path.dirname (sys.argv [0])', et 'os.path.join (basepath, '..', '..', 'fichierIwantToOpen.txt')'. J'utiliserais aussi '__file__' plutôt que' sys.argv [0] 'moi-même. –

3

Cela devrait vous déplacer dans le répertoire où se trouve le script, si vous n'êtes pas déjà là:

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