2013-06-04 35 views
0

我在Linux上使用cron-scheduled Python 2.7程序在CodeIgniter應用程序樹內創建各種HTML文件部分,圖像縮略圖等。實際的Python程序位於CodeIgniter樹下,位於應用程序目錄下一級子目錄下,如下所示。從Linux的Python子目錄查找頂級目錄

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

我想確定從my-program.pyos.path模塊使用方法中的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調用?

回答

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

我感到驚喜的是

  • ABSPATH()管理的正確解析,而無需使用os.path.join()
  • 我們以前是沒有的我們所建立的路徑

對於跨平臺compatibili剝離出來的文件名如果abspath的解析不起作用,我們可以使用不易讀的東西,例如

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

根據「上三個目錄」的相對路徑查找真實路徑,並提取該真實路徑的最後部分。

[編輯:回覆您的評論我修改了這個。在我看來,它變得越來越複雜 足夠你dirname的鏈條更好。至少這是很容易理解它的發生。]

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

shtako ......你快:) +1 – Ochi

+0

這實際上導致它也躥升一個太多的目錄級別。是否有一種方法可以根據__file__屬性執行此操作,以便起始目錄不會影響程序的執行。例如,如果我想從我的$ HOME目錄除cronjob之外執行此操作,程序將因指定相對路徑而中斷。 – JTP