2010-12-07 39 views
13

OS模块的文档似乎没有关于如何打开不在子目录中的文件或运行脚本的当前目录中的信息,而没有完整路径。我的目录结构看起来像这样。Python os模块以相对路径打开当前目录上的文件

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

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

给出文件未找到错误。但是,如果我在cgi-bin目录中启动python解释器并尝试使用open("../../fileIwantToOpen.txt","r")。出于明显的可移植性原因,我不想在完整路径中进行硬编码。操作系统模块中是否有一组方法,CAN这样做?

+0

嗯。这可能是一个权限错误,或者CGI的工作目录可能与你的python解释器不一样。确切的错误信息可能会有帮助。另外,在你的CGI中,尝试`print os.getcwd()`看看有什么说的。 – 2010-12-07 21:09:11

+0

您的CGI脚本是否在chroot监狱运行?如果是这样,那么这是行不通的,因为你无法逃离监狱。 – 2010-12-07 21:15:48

回答

33

给出open的路径应该相对于当前工作目录,即运行脚本的目录。所以上面的例子只有在你从cgi-bin目录运行它时才会起作用。

一个简单的解决方案是让你的路径相对于脚本。一种可能的解决方

from os import path 

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

这样你会得到你正在运行的脚本(基本路径)的路径,并加入与您要打开的文件的相对路径。 os.path将负责加入两条路径的细节。

3

这应该你进入这里的脚本所在,如果你已经不存在的目录:

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