2012-12-19 3 views
1

주어진 모듈에 대한 py 파일의 파일 시스템 위치를 런타임에 안정적으로 발견하는 가장 좋은 방법을 찾으려고합니다. 일부 메소드 (이 경우 인터페이스가 모듈에 정의 된 서비스 호출의 응답을 검증하는 데 사용되는 스키마)에 대한 일부 구성 데이터를 정리할 계획이므로 청결하고 유지 보수가 쉽기 때문에이 작업을 수행해야합니다.모듈의 py 파일 경로를 신뢰할 수있는 방법

시스템의 단순화 illusutration :

package 
| 
|-service.py 
| 
|-call1.scm 
| 
|-call2.scm 

service.py (즉 무관 비록 _call()는 질문에, 기본 클래스의 방법이다)

class FooServ(AbstractService): 
    def call1(*args): 
     result = self._call('/relative/uri/call1', *args) 
     # additional call specific processing 
     return result 
    def call2(*args): 
     result = self._call('/relative/uri/call2', *args) 
     # additional call specific processing 
     return result 

call1.scm 및 call2 .scm 응답 스키마를 정의합니다 (현재의 경우 초안 JSON 스키마 형식을 사용하여 다시 질문과 관련 없음)

다른 p 레이스를 코드베이스에서 서비스 호출이 실제로 만들어지면 service.py의 위치를 ​​감지하여 파일 구조를 탐색하고 scm 파일을 찾을 수 있기를 원합니다. 내 시스템에 적어도, 나는이 일 것이라고 생각 :

# I realize this is contrived here, but in my code, the method is accessed this way 
method = FooServ().call1 
module_path = sys.modules[method.__self__.__class__.__module__].__file__ 
schema_path = os.path.join(os.path.dirname(module_path), method.__name__ + '.scm') 

그러나, 나는이 모든 플랫폼 및 설치 구성에 안전 할 것입니다 있는지 확인하고 싶어하고, 연구를하고있는 동안 나는 this 건너 온 나를 만든있는 이 방법을 이렇게하면 신뢰성있게 작동하지 않을 것이라고 우려했습니다. 이 기능은 보편적으로 작동합니까, 아니면 모듈 객체의 __file__pyc 파일의 위치를 ​​반환합니다. 이는 py 파일이 아닌 다른 위치에있을 수 있습니다.이 솔루션을 비효율적으로 만들려고합니까? 효과가 없다면 대신 무엇을 할 수 있습니까? 에서

답변

1

PEP 당신이 그것을 말한다 링크 :

파이썬 3에서 당신은 모듈을 가져올 때, 소스 평 파일의 __file__ 속성 ​​포인트 (파이썬 2, 그것은 PYC 파일을 가리키는).

그래서 파이썬 3에서는 __file__이 항상 .py 파일을 가리키기 때문에 괜찮습니다. 파이썬 2에서는이 .pyc 파일을 가리킬 수 있지만, .pyc은 오직 파이썬 2의 .py 파일과 같은 디렉토리에


괜찮을 것, 나는 당신이이 비트를 참조 있다고 생각 :

이러한 배포판은 pyc 파일을 공유 할 수 없으므로 소스 코드가 공유되는 동안 결과로 나타나는 pyc 파일을 비공유 위치에 저장하는 정교한 메커니즘이 개발되었습니다. 예를 들어 symlink 기반의 데비안 시스템 인 python-support [8]와 python-central [9]이 있습니다. 이러한 접근 방식은 Python 응용 프로그램을 다양한 사용자에게 제공하기 위해 훨씬 복잡하고 취약하며 이해하기 어렵고 조각난 정책을 만듭니다.

이러한 메커니즘은 배포 패키지로 묶인 파이썬 모듈에만 적용됩니다. 내가하지 않는다 그들은 유통 시스템의 포장 시스템 밖에서 수동으로 설치된 모듈에 영향을 미쳐야한다고 생각한다. 모듈이 그 메커니즘에 의해 손상되지 않았는지 확인하기 위해 그 배포본을 위해 모듈을 패키징하는 것은 누구의 책임 일 것입니다.

+0

저는 Python 2.7을 사용 중입니다. 나는 많은 인터프리터와 OS 구성이 pyc 파일 생성을 처리하는 우연한 방법과 모순 된 방법에 대해 이야기하는 텍스트의 큰 덩어리에 더 관심이있었습니다. –

+0

편집자에게 : 그건 의미가 있습니다. 나는 맥과 다른 플랫폼을 추적하여 그곳에서 무슨 일이 일어나는지 보려고 노력할 것이라고 생각하지만, 이제는 일이 잘 될 것이라고 확신한다. 감사. –

+0

나는이 문제가 모든 플랫폼에서 중요하다는 것을 확인 했으므로 나는 훌륭하다고 생각한다. 다시 한번 감사드립니다. –

관련 문제