【问题标题】:Find top-level directory from subdirectory on Linux in Python在 Python 中从 Linux 上的子目录中查找顶级目录
【发布时间】:2013-05-31 05:24:39
【问题描述】:

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

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

我想使用os.path 模块中的方法从my-program.py 中确定codeigniter/web-root 目录。但是,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__))))

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

【问题讨论】:

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


    【解决方案1】:
    import os.path
    print os.path.abspath(__file__+'/../../..')   # the directory three levels up
    

    我很惊喜

    • abspath() 成功解析,无需使用 os.path.join()
    • 我们不必在构建路径之前去掉文件名

    如果 abspath 的解析不起作用,为了跨平台兼容性,我们可以使用可读性较差的东西,例如

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • shtako... 你更快 :) +1
      • 这实际上导致它也跳了太多的目录级别。是否有办法始终基于 file 属性执行此操作,以便起始目录不会影响程序的执行。例如,如果除了 cronjob 之外,我还想从我的 $HOME 目录执行此操作,程序将会中断,因为指定了相对路径。
      猜你喜欢
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      相关资源
      最近更新 更多