[python] setup.py를 사용하여 비 파이썬 파일 포함

setup.py코드에 포함되지 않은 파일을 포함 시키 려면 어떻게해야 합니까? (특히 라이센스 파일이지만 다른 것일 수도 있습니다.)

파일 위치를 제어 할 수 있기를 원합니다. 원본 소스 폴더에서 파일은 패키지의 루트에 있습니다. (즉, 최상위와 같은 수준에 있습니다 __init__.py.) 운영 체제와 상관없이 패키지가 설치 될 때 정확하게 유지되기를 원합니다. 어떻게합니까?



답변

이 작업을 수행하는 가장 좋은 방법은 setuptools package_data지시문 을 사용하는 것 입니다. 이것은 대신 setuptools(또는 distribute)을 사용한다는 것을 의미 distutils하지만 이것은 매우 원활한 “업그레이드”입니다.

다음은 전체이지만 테스트되지 않은 예입니다.

from setuptools import setup, find_packages

setup(
    name='your_project_name',
    version='0.1',
    description='A description.',
    packages=find_packages(exclude=['ez_setup', 'tests', 'tests.*']),
    package_data={'': ['license.txt']},
    include_package_data=True,
    install_requires=[],
)

여기서 중요한 특정 라인을 참고하십시오.

package_data={'': ['license.txt']},
include_package_data=True,

package_datadict패턴 목록에 패키지 이름 (빈 = 모든 패키지) (globs의를 포함 할 수 있습니다)의. 예를 들어, 패키지 내에 파일 만 지정하려면 다음을 수행하십시오.

package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}

여기서 해결책 은 확장자가 아닌 파일 이름을 바꾸지 않는 것 입니다.py.py

자세한 내용은 Ian Bicking의 프레젠테이션 을 참조하십시오.

업데이트 : 다른 [더 나은] 접근 방식

소스 배포 ( sdist) 의 내용을 제어 하고 패키지 외부에 파일이있는 경우 (예 : 최상위 디렉토리) MANIFEST.in파일 을 추가하는 것이 효과적 입니다. 이 파일의 형식에 대해서는 Python 설명서 를 참조하십시오 .

이 응답을 작성한 이후, MANIFEST.in소스 배포 ( tar.gz)에 필요한 파일이 있는지 확인하는 것이 일반적으로 사용하는 것이 덜 실망스러운 방법 이라는 것을 알았습니다 .

예를 들어, requirements.txt최상위에서 from 을 포함하려면 최상위 “data”디렉토리를 반복적으로 포함하십시오.

include requirements.txt
recursive-include data *

그럼에도 불구하고 설치시 이러한 파일을 사이트 패키지 내의 패키지 폴더에 복사하려면 기능 에 공급 include_package_data=True해야합니다 setup(). 자세한 내용은 비 코드 파일 추가 를 참조하십시오.


답변

당신이 묘사 한 것을 성취하기 위해서는 두 단계가 필요합니다 …

  • 파일을 소스 tarball에 추가해야합니다
  • 데이터 파일을 소스 경로에 설치하려면 setup.py를 수정해야합니다.

1 단계 : 파일을 소스 타르볼에 추가하려면 매니페스트에 포함 시키십시오

setup.py를 포함하는 폴더에 MANIFEST 템플릿을 만듭니다.

MANIFEST는 기본적으로 소스 tarball에 포함될 모든 파일 목록이있는 텍스트 파일입니다.

내 프로젝트의 매니페스트는 다음과 같습니다.

  • CHANGELOG.txt
  • INSTALL.txt
  • LICENSE.txt
  • pypreprocessor.py
  • README.txt
  • setup.py
  • test.py
  • TODO.txt

참고 : sdist 일부 파일을 자동으로 추가하지만 파일의 기능 을 예측하지 않고 명시 적으로 지정하는 것을 선호합니다.

2 단계 : 데이터 파일을 소스 폴더에 설치하려면 setup.py를 수정하십시오.

소스 설치 폴더에 데이터 파일 (LICENSE.txt)을 추가하려면 소스 설치 경로와 일치하도록 데이터 설치 경로를 수정해야합니다. 기본적으로 데이터 파일은 소스 파일과 다른 위치에 설치되므로 필요합니다.

소스 설치 디렉토리와 일치하도록 데이터 설치 디렉토리를 수정하려면 …

다음을 사용하여 distutils에서 설치 디렉토리 정보를 가져옵니다.

from distutils.command.install import INSTALL_SCHEMES

소스 설치 디렉토리와 일치하도록 데이터 설치 디렉토리를 수정하십시오.

for scheme in INSTALL_SCHEMES.values():
    scheme['data'] = scheme['purelib']

그리고 데이터 파일과 위치를 setup ()에 추가하십시오.

data_files=[('', ['LICENSE.txt'])]

참고 : 위의 단계는 확장 라이브러리를 요구하지 않고 표준 방식으로 정확하게 설명한 것을 수행해야합니다.


답변

필요한 디렉토리 또는 파일 이름으로 MANIFEST.in프로젝트 루트에 작성 하십시오.recursive-includeinclude

include LICENSE
include README.rst
recursive-include package/static *
recursive-include package/templates *

설명서는 여기에서 찾을 수 있습니다


답변

질문 중 하나에 의견을 게시하고 싶었지만 평판이 충분하지 않아서>.>

다음은 나를 위해 일한 것입니다 (문서를 참조한 후 나왔습니다).

package_data={
    'mypkg': ['../*.txt']
},

include_package_data: False

마지막 줄은 이상하게도 나에게 중요했습니다 (이 키워드 인수를 생략 할 수도 있습니다-동일하게 작동합니다).

이것이하는 일은 최상위 또는 루트 디렉토리 ( mypkg배포하려는 패키지에서 한 단계 위)의 모든 텍스트 파일을 복사하는 것 입니다.

도움이 되었기를 바랍니다!


답변

1 단계 :MANIFEST.in setup.py를 사용하여 동일한 폴더에 파일 생성

2 단계 : 추가 할 파일의 상대 경로 포함MANIFEST.in

include README.rst
include docs/*.txt
include funniest/data.json

3 단계 : 이 파일을 사이트 패키지로 복사 include_package_data=True하는 setup()기능 설정

참조가 여기 있습니다.


답변

2019 년이며 여기에 조언이 있음에도 불구하고 여기에서 작동하는 내용이 있습니다. 중간 인터넷에서 찾은 내용은를 사용하여 setuptools_scm옵션으로 전달되었습니다.setuptools.setup . 여기에는 VCS에 버전이 지정된 데이터 파일 (git 또는 기타)이 휠 패키지로 포함되며 git 저장소에서 “pip install”을 만들어 해당 파일을 가져옵니다.

방금이 두 줄을 “setup.py”의 설정 호출에 추가했습니다. 추가 설치 또는 가져 오기가 필요하지 않습니다.

    setup_requires=['setuptools_scm'],
    include_package_data=True,

package_data 또는 MANIFEST.in 파일에 수동으로 나열 할 필요가 없습니다. 버전이 지정된 경우 패키지에 포함됩니다. “setuptools_scm”의 문서는 커밋 위치에서 버전 번호를 만드는 데 중점을두고 데이터 파일을 추가 할 때 실제로 중요한 부분을 무시합니다. (중간 휠 파일의 이름이 “* 0.2.2.dev45 + g3495a1f”이거나 입력 한 하드 코딩 된 버전 번호 “0.3.0dev0″을 사용하는 경우에는 신경 쓰지 않아도됩니다. 그러나 프로그램의 중요한 파일은 뒤에 일이 다소 중요하다)


답변

setup. 아래의 setup.py에서 :

setup(
   name = 'foo library'
   ...
  package_data={
   'foolibrary.folderA': ['*'],     # All files from folder A
   'foolibrary.folderB': ['*.txt']  #All text files from folder B
   },