2014-12-22 4 views
4

말에서 설치 방식/접두사를 결정, 내가 setup.py 가진 다음 라인 파이썬 패키지가 :파이썬 패키지 코드

... 
packages=['mypkg'], 
data_files=[ 
    ('lib/mypkg/', [...]), 
    ('share/mypkg/', [...]), 
] 
... 

나는 여러 실행 헬퍼 $(prefix)/lib/mypkg 및 패키지 관련 데이터 파일에 설치되어야하는 가정 $(prefix)/share/mypkg에 설치해야합니다. 요점은 $(prefix)은 다른 배포판마다 다를 수 있다는 것입니다. 예를 들어 centos 시스템에서는 prefix=/usr이고, debian 시스템에서는 기본적으로 prefix=/usr/local입니다. 또한 사용자 정의 접두사 또는 심지어 사용자 정의 설치 구성표를 알고 setup.py 매개 변수로 제공 될 수 있습니다.

그래서 내 패키지의 파이썬 코드를 사용하여 패키지 데이터가 설치된 위치를 엄격하게 결정할 수 있기를 원합니다. 순간 나는 해결책 다음 사용하고, 그러나 그것은 나에게 서투른 보인다 나는 그것이 사용자 정의 설치 방식의 경우에는 비효율적 일 것입니다 가정 :

# mypkg/__init__.py 
import os 
initpath = __path__[0] 

while True: 
    datapath, _ = os.path.split(initpath) 
    if datapath == initpath: 
     break 
    initpath, datapath = datapath, os.path.join(datapath, 'share', 'mypkg') 
    if os.path.exists(datapath): 
     print datapath 

이 그것을 할 수있는 더 좋은 방법이 있나요?

import sysconfig 
import pkg_resources 

self.install_scheme = None 
distribution = pkg_resources.get_distribution('mypkg') 
lib_path = distribution.location 
schemes = sysconfig.get_scheme_names() 
for s in schemes: 
    p = sysconfig.get_path('purelib', s) 
    if p == lib_path: 
     self.install_scheme = s 

이 패키지 메타 데이터의이 만들어 pip를 통해 설치 패키지 작동 :

답변

2

내가 흥분하는 방법은 다음과 같은 코드입니다. 당신은 당신이 (액세스 할 수있는 객체의 모든 것을 내 경우에는 인스턴스 변수)를 필요로하는 곳에에 액세스 할 수있어 변수로 self.install_scheme을 변경하고 다음과 같이 사용 : self.install_schemeNone했다

data_path = sysconfig.get_path('data', self.install_scheme) 

있다면, 그냥 sysconfig.get_path() (내 플랫폼에 대한 기본 구성표를 제공)없이 구성표 이름을 사용하여 갔고 최선을 희망했다.