使用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/
。
所以实际上我的问题现在是双重的:
- 如何使用
os.path
查看__file__
一级目录。 换句话说,我想要/Users/hobbes3/Sites/mysite/mysite/settings.py
使用相对pathfind/Users/hobbes3/Sites/mysite/templates
。 - 我应该在项目
/User/hobbes3/Sites/mysite
级别还是在/User/hobbes3/Sites/mysite/mysite
上保存template
文件夹(具有跨应用程序模板,如admin
,registration
等)?
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', )