2013-06-04 3 views
0

Linux의 cron-scheduled Python 2.7 프로그램을 사용하여 CodeIgniter 응용 프로그램 트리 내에서 다양한 HTML 파일 부품, 이미지 축소판 등을 만듭니다. 실제 Python 프로그램은 다음과 같이 응용 프로그램 디렉토리의 한 수준 아래 서브 디렉토리에있는 CodeIgniter 트리 아래에 있습니다.Python Linux의 서브 디렉토리에서 최상위 디렉토리 찾기

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__)))) 

여러 os.path.dirname 전화를 사용하지 않고 최상위 수준 (ci_root) 디렉토리를 판별 할 수있는 청소기 방법이 있나요?

답변

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

내가 os.path.join 사용하지 않고,

  • abspath()가 올바르게 구문 분석하는 관리되는 것을 놀랐다()
  • 우리는 우리가 크로스 플랫폼 compatibili의 경로

을 구축하기 전에 파일 이름을 제거 할 필요가 없었다 abspath의 파싱이 작동하지 않으면, 우리는 덜 읽을 수있는 것을 사용할 수 있습니다. 대신 '/'의

  • os.path.sep
  • os.path.join()
1

"위로 세 개의 디렉토리"의 상대 경로를 기반으로 실제 경로를 찾고 그 실제 경로의 마지막 부분을 추출하십시오.

[편집 : 귀하의 의견에 대한 답변으로 나는 이것을 개정했습니다. 제 의견으로는 님의 체인이 더 복잡해지고 있습니다. 적어도 일어나는 이해하기 쉽습니다.]

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

shtako ... 당신했다 빠른 :) 사실이 너무 뛰어 원인 일 – Ochi

+0

을 하나의 디렉토리 레벨이 너무 많습니다. 시작 디렉토리가 프로그램 실행에 영향을 미치지 않도록 항상 __file__ 속성을 기반으로이 작업을 수행 할 수있는 방법이 있습니까? 예를 들어, cronjob과 함께 $ HOME 디렉토리에서 이것을 실행하려면 상대 경로가 지정되어 있기 때문에 프로그램이 중단됩니다. – JTP

관련 문제