0

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

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

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

当前脚本使用以下结构来确定“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__))))

有没有更简洁的方法来确定顶级(ci_root)目录而不使用多次os.path.dirname调用?

4

2 回答 2

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()
于 2013-10-03T11:43:59.243 回答
1

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

[编辑:为了回应您的评论,我已对此进行了修改。在我看来,它变得足够复杂,以至于你的dirname's 链更好。至少很容易理解它发生了什么。]

from os import path as p
_, ci_root = p.split(p.abspath(p.join(__file__, '../../..')))
于 2013-06-04T17:52:52.193 回答