2017-05-22 4 views
0

setup.py 및 setuptools를 사용하여 프로젝트 용 패키지를 빌드하려고합니다. 일반적인 검색은 데이터 파일을 내 파이썬 패키지 아래에 배치해야한다고 제안했습니다.
예를 들어 project/src/package/data입니다.데이터 파일의 전체 디렉토리 설치

그러나 내 상황은 this question과 일치합니다.

내 프로젝트는 Python 콘솔 응용 프로그램과 HTML 대화 형 응용 프로그램으로 구성됩니다. 바로 지금 (setup.py 전) 콘솔 응용 프로그램에서 특수 명령을 사용하여 HTML 파일을 특정 디렉토리에 복사했습니다. 소스 제어에서이 디렉토리 구조를 따릅니다.

project 
|-+ console 
| |-+ package 
|  |-- __init__.py, etc. 
|-+ viz 
    |-+ css 
    |-+ js 
    |-- index.html 

나는이 문제가 setup.py와 계란 파일을 복제 할 수있는 방법을 모르겠어요.

  1. viz을 어떻게 포장 할 수 있습니까? package_data 옵션은 패키지와 관련이있는 것 같습니다 (viz을 패키지 아래에 넣어야 함을 의미 함).

    그래서 package_data = {'': ['viz/*']}은 내가 찾고있는 것이 아닙니다.

  2. 추출은 어떻게 수행됩니까?
    viz을 캐시에 넣고 shutil을 사용하여 파일을 원하는 위치에 복사하려면 pkg_resources.resource_filename을 사용해야합니까? 더 실용적인 대안이 있습니까?

답변

0

나는 전체 구조를 변경하고 viz을 패키지로 바꾸는 것을 고려해 거기에 그것을 설치하는 코드를 옮겼다. 결과는 그렇게 될 것입니다. 이 동안

project 
|-- setup.py 
|-+ top-level-package 
    |-- __init__.py 
    |-+ console 
    | |-- __init__.py, etc. 
    |-+ viz 
     |-+ css 
     |-+ js 
     |-- index.html 
     |-- __init__.py 

일한 것, 사실은 내 원래의 목적을 위해 작동 an answer을 발견했다. setup.py은 파일을 package_data으로 재귀 적으로 복사해야하며 상대 경로는 ..과 작동합니다.
def package_files(directory): 
    paths = [] 
    for (path, directories, filenames) in os.walk(directory): 
     for filename in filenames: 
      paths.append(os.path.join("..", path, filename)) 
    return paths 

extra_files = package_files("viz") # this is relative to the project root 

setup(
    ..., 
    package_data = {"mypackage": extra_files} 
) 

난 그냥 하나에 원래 consolepackage을 붕괴, 그래서 파이썬 패키지는 프로젝트 루트 바로 아래에 앉아있다. 이것이 나의 최종 구조입니다.

project 
|-- setup.py 
|-+ package 
| |-- __init__.py, etc. 
| |-+ private 
|  |-- ... 
|-+ viz 
    |-+ css 
    |-+ js 
    |-- index.html