使用Python的os.path,我该如何去一个目录?

我最近把Django从v1.3.1升级到v1.4。

在我以前的settings.py

 TEMPLATE_DIRS = ( os.path.join(os.path.dirname( __file__ ), 'templates').replace('\\', '/'), # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. ) 

这将指向/Users/hobbes3/Sites/mysite/templates ,但是由于Django v1.4将项目文件夹移动到与应用程序文件夹相同的级别 ,因此我的settings.py文件现在位于/Users/hobbes3/Sites/mysite/mysite/而不是/Users/hobbes3/Sites/mysite/

所以实际上我的问题现在是双重的:

  1. 如何使用os.path查看__file__一级目录。 换句话说,我想要/Users/hobbes3/Sites/mysite/mysite/settings.py使用相对pathfind/Users/hobbes3/Sites/mysite/templates
  2. 我应该在项目/User/hobbes3/Sites/mysite级别还是在/User/hobbes3/Sites/mysite/mysite上保存template文件夹(具有跨应用程序模板,如adminregistration等)?
 os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'templates')) 

至于模板文件夹应该去的地方,我不知道,因为Django 1.4刚刚出来,我还没有看过它。 你也许应该问一个关于SE的问题来解决这个问题。

你也可以使用normpath来清理path,而不是abspath 。 但是,在这种情况下,Django需要一个绝对path而不是相对path。

为了跨平台兼容性,请使用os.pardir而不是'..'

要获取文件的文件夹,只需使用:

 os.path.dirname(path) 

要获取文件夹,只需再次使用os.path.dirname

 os.path.dirname(os.path.dirname(path)) 

你可能想检查__file__是否是符号链接:

 if os.path.islink(__file__): path = os.readlink (__file__) 

你要的确如此:

 BASE_DIR = os.path.join( os.path.dirname( __file__ ), '..' ) 
 from os.path import dirname, realpath, join join(dirname(realpath(dirname(__file__))), 'templates') 

更新:

如果你碰巧通过符号链接“复制” settings.py ,@ forivall的答案是更好的:

 ~user/ project1/ mysite/ settings.py templates/ wrong.html project2/ mysite/ settings.py -> ~user/project1/settings.py templates/ right.html 

上面的方法将“看到” wrong.html而@ forivall的方法将看到right.html

在没有符号链接的情况下,两个答案是相同的。

就个人而言,我会去function方法

 def get_parent_dir(directory): import os return os.path.dirname(directory) current_dirs_parent = get_parent_dir(os.getcwd()) 

我认为最简单的事情就是重用dirname()所以你可以调用

 os.path.dirname(os.path.dirname( __file__ )) 

如果你的文件位于/Users/hobbes3/Sites/mysite/templates/method.py

这将返回“/用户/ hobbes3 /网站/ mysite”

这可能会对其他情况下,你想要去x文件夹有用。 只要运行walk_up_folder(path, 6)上去6个文件夹。

 def walk_up_folder(path, depth=1): _cur_depth = 1 while _cur_depth < depth: path = os.path.dirname(path) _cur_depth += 1 return path 

对于像我这样的偏执狂,我更喜欢这个

TEMPLATE_DIRS = ( __file__.rsplit('/', 2)[0] + '/templates', )