2017-11-23 4 views
1

설치시 사용자의 홈 디렉토리에 복사 할 구성 파일과 함께 제공되는 Python 프로젝트를 패키지하려고합니다. 패키징에 대한 빠른 가이드는 인수를 setuptools.setup에 사용하여 수행 할 수 있다고 말합니다. 그래서 내가 가진 것입니다 : 이것은 python setup.py install를 사용하는 경우 잘 작동하는 표시설치시 구성 파일 복사

data_files = [(os.path.expanduser("~"), [".my_config"])] 

,하지만 난 pip install를 PyPI에 내 패키지를 업로드하고 실행할 때 dotfile는 복사되지 않습니다.

FWIW, 나는 MANIFEST.in에 dotfile을 넣고도 setuppackage_data 인수를 포함하여 시도했습니다. 이 단계들 중 어떤 것도 차이를 만드는 것처럼 보이지 않습니다. 내가 pip install이고 site-packages 디렉토리 주위를 돌면 소스 파일 만 있습니다.

내가 원하는 것을 어떻게 얻을 수 있습니까?

답변

1

이것은 나 자신을 한 번 경험 한 문제입니다. 그 루트는 휠 파일을 만들 때 data_files에 지정된 모든 절대 경로가 대상 site-packages 디렉토리로 상대화됩니다 (this issue on github 참조).

$ pip install spam-0.1.tar.gz 
Processing ./spam-0.1.tar.gz 
Building wheels for collected packages: spam Running setup.py bdist_wheel for spam ... done 
    Stored in directory: /Users/hoefling/Library/Caches/pip/wheels/d0/95/be/bc79f1d589d90d67139481a3e706bcc54578fdbf891aef75c0 
Successfully built spam 
Installing collected packages: spam 
Successfully installed spam-0.1 

확인 설치된 파일의 수율 :

$ pip show -f spam 
Name: spam 
Version: 0.1 
... 
Location: /Users/hoefling/.virtualenvs/stackoverflow/lib/python3.6/site-packages 
Requires: 
Files: 
    Users/hoefling/.my_config 
    spam-0.1.dist-info/DESCRIPTION.rst 
    spam-0.1.dist-info/INSTALLER 
    spam-0.1.dist-info/METADATA 
    spam-0.1.dist-info/RECORD 
    spam-0.1.dist-info/WHEEL 
    spam-0.1.dist-info/metadata.json 
    spam-0.1.dist-info/top_level.txt 

참고이 결과 바퀴는 모든 소스 패키지 (.tar.gz, .tar.bz2 또는 .zip) 중 바퀴를 구축 할 예정으로 pip install에 의해 수행 설치에 영향을 미친다 설치 절대 경로는 Location 디렉토리와 관련이 있습니다. 이 예에서 .my_config/Users/hoefling/.virtualenvs/stackoverflow/lib/python3.6/site-packages/Users/hoefling/.my_config 아래에 배치됩니다.

내장 휠이 디스크에 캐시되어있어 다음 번에 패키지를 다시 설치하면 내장 휠이 pip의 캐시에 계속 남아있어 설치에 사용되며 더 이상 설치되지 않습니다. 터미널 로그에 휠을 만드는 것에 대한 언급을 참조하십시오.

이를 피하기위한 실제 해결책은 없습니다. 파일이 올바르게 배치

$ pip install spam-0.1.tar.gz --no-binary=spam 
Processing ./spam-0.1.tar.gz 
Skipping bdist_wheel for spam, due to binaries being disabled for it. 
Installing collected packages: spam 
    Running setup.py install for spam ... done 
Successfully installed spam-0.1 

:

$ pip show -f spam 
Name: spam 
Version: 0.1 
... 
Location: /Users/hoefling/.virtualenvs/stackoverflow/lib/python3.6/site-packages 
Requires: 
Files: 
    ../../../../../.my_config 
    spam-0.1-py3.6.egg-info/PKG-INFO 
    spam-0.1-py3.6.egg-info/SOURCES.txt 
    spam-0.1-py3.6.egg-info/dependency_links.txt 
    spam-0.1-py3.6.egg-info/top_level.txt 

불행하게도, 사용자 내가 찾은 가장 괜찮은 해결 방법은 설치에 패키지의 setup.py의 실행을 시행 설치할 때 "바이너리"패키지를 금지하는 것입니다 패키지 메타 데이터에서 바퀴를 만들지 못하게 할 수 있으므로 pip install에 추가 키 (readme, 웹 페이지 FAQ 등을 통해)를 호출하는 것에 대해 별도로 알려야합니다.

그 결과 절대 경로가 포함 된 파일을 더 이상 포함하지 않습니다. 대신, 파이썬 소스를 site-packages 디렉토리에 설치합니다. 파이썬 코드에서 필요한 경우 존재 체크와 파일 복사를위한 추가 로직을 추가해야합니다 :

# program entrypoint 

if __name__ == '__main__': 
    config = os.path.join(os.path.expanduser('~'), '.my_config') 
    if not os.path.exists(config): 
     shutil.copyfile('.my_config', config) 
    main.run() 
+0

감사합니다 : pip'는 업그레이드 할 때 잘못된 것을 수행하고 기존의 dotfile을 자동으로 덮어 씁니다. – Xophmeister