从Python中的Linux子目录中查找顶级目录

时间:2013-06-04 17:44:38

标签: python linux python-2.7 directory os.path

我正在使用Linux上的cron-scheduled CodeIgniter程序从Python 2.7应用程序树中创建各种HTML文件部分,图像缩略图等。实际的Python程序存在于CodeIgniter树下的应用程序目录下一级子目录中,如下所示。

codeigniter/web-root 
    |
    application
    |   |    
    |   scripts
    |   |   |
    |   |   my-program.py
    |   | 
    |   database
    |       |
    |       database.sqlite 
    images

我想使用codeigniter/web-root模块中的方法从my-program.py中确定os.path目录。但是,codeigniter/web-root的绝对路径在开发和生产环境中是不同的,因此我不希望将此路径信息硬连接到Python程序本身。

当前脚本使用以下构造来确定“codeigniter / web-root”的绝对路径,这是两个环境中脚本本身之上的两个目录级别。

#!/bin/env python2.7

import os.path

ci_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

是否有更简洁的方法可以在不使用多个os.path.dirname调用的情况下确定顶级(ci_root)目录?

2 个答案:

答案 0 :(得分:2)

import os.path
print os.path.abspath(__file__+'/../../..')   # the directory three levels up

我很惊喜

  • abspath()设法正确解析,而不使用os.path.join()
  • 在构建路径
  • 之前,我们不必删除文件名

对于跨平台兼容性,如果abspath的解析不起作用,我们可以使用不太可读的东西,例如。

  • os.path.sep而不是'/'
  • os.path.join()

答案 1 :(得分:1)

根据“向上三个目录”的相对路径找到真实路径,并提取该真实路径的最后一部分。

[编辑:在回复您的评论时,我已修改此内容。在我看来,它变得越来越复杂 足够你的dirname链更好。至少很容易理解它发生了什么。]

from os import path as p
_, ci_root = p.split(p.abspath(p.join(__file__, '../../..')))