2010-12-07 2 views
13

OS 모듈에 대한 문서는 하위 디렉토리 나 스크립트가 실행중인 현재 디렉토리에없는 파일을 여는 방법에 대한 정보가 없습니다 전체 경로. 내 디렉토리 구조는 다음과 같습니다.Python os module 상대 경로로 현재 디렉토리 위의 파일 열기

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

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

파일을 찾을 수 없습니다. 오류가 발생합니다. 그러나 cgi-bin 디렉토리에서 파이썬 인터프리터를 시작하고 open("../../fileIwantToOpen.txt","r")을 시도하면 작동합니다. 명백한 이식성을 이유로 완전한 경로로 하드 코드를 작성하고 싶지 않습니다. OS 모듈에 CAN CAN 메소드가 있습니까?

+0

흠. 권한 오류이거나 CGI의 작업 디렉토리가 파이썬 인터프리터와 다를 수 있습니다. 정확한 오류 메시지가 도움이 될 수 있습니다. 또한 CGI에서'print os.getcwd()'를 시도하고 그 내용을 확인하십시오. –

+0

CGI 스크립트가 chroot jail에서 실행 중입니까? 그렇다면 감옥에서 탈출 할 수 없으므로이 방법은 효과가 없습니다. –

+0

@ Adam Rosenfield no. @ Jason 말 그대로 cgi-bin 디렉토리에서 파이썬 인터프리터를 실행하므로 cgi-bin 디렉토리에서 실행되는 스크립트 내부에서 어떻게 작동하는지 이해할 수 없습니다. –

답변

33

open에 지정된 경로는 스크립트를 실행하는 현재 작업 디렉토리와 관련이 있어야합니다. 위의 예는 cgi-bin 디렉토리에서 실행하는 경우에만 작동합니다.

간단한 해결책은 스크립트에 상대적인 경로를 만드는 것입니다. 가능한 한 가지 해결책.

from os import path 

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

이 방법 당신은 당신이 실행중인 스크립트 (basepath)의 경로를 얻을 열려는 파일의 상대 경로와 그 가입 수 있습니다. os.path은 두 경로를 결합하는 세부 사항을 처리합니다.

+0

이 명령은 그냥 ../../fileIwantToOpen.txt 경로로 제공하고 여전히 그것을 찾을 수 없습니다 . –

+0

이 제품을 사용해 보니 잘 작동하는 것 같습니다. – terminus

+0

@terminus :'basepath = os.path.dirname (sys.argv [0])'및'os.path.join (기본 경로, '..', '..', 'fileIwantToOpen.txt')'. 또한'sys.argv [0]'보다는'__file__'을 사용합니다. –

3

이 이미 존재하지 않는 경우 스크립트가있는 디렉토리로 당신을 이동해야합니다 :

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