setuptools / distribute에 패키지 데이터를 포함시키는 방법은 무엇입니까?


135

setuptools / distribute를 사용할 때 설치 프로그램이 package_data파일 을 가져올 수 없습니다 . 내가 읽은 모든 것은 다음이 올바른 방법이라고 말합니다. 누군가 조언 해 줄 수 있습니까?

setup(
   name='myapp',
   packages=find_packages(),
   package_data={
      'myapp': ['data/*.txt'],
   },
   include_package_data=True,
   zip_safe=False,
   install_requires=['distribute'],
)

myapp/data/데이터 파일의 위치는 어디 입니까?


2
같은 문제가 발생했습니다 ... 수동으로 지정 data_files하면 문제가 해결되었습니다. 그러나 이것은 오류가 발생하기 쉽고 나에게 "정확한 느낌"이 아닙니다. 누군가가 정말 있는지 확인 할 필요가 모두 구성 복제 package_datadata_files?
exhuma

github.com/wimglenn/resources-example을 사용하여 데이터 파일을 바퀴와 sdist에 올바르게 패키징 할 수있는 최신 setuptools 프로젝트 구조를 보여줍니다 pyproject.toml. setup.py파일이 필요 하지 않습니다.
wim

답변:


289

나는 이것이 오래된 질문이라는 것을 알고 있지만, 사람들이 구글을 통해 자신의 길을 찾는 package_data것은 낮고 더러운 거짓말 입니다. 그것은에만 사용됩니다 구축 할 때 바이너리 패키지를 ( python setup.py bdist ...)하지만 하지 소스 패키지를 만들 때 (python setup.py sdist ... )를 . 물론 이것은 우스운 일입니다. 소스 배포판을 만들면 이진 배포판을 빌드하기 위해 다른 사람에게 파일 모음을 보낼 수 있습니다.

어쨌든 사용 MANIFEST.in은 바이너리 배포와 소스 배포 모두 에서 작동 합니다 .


97
지난 한 시간 동안이 문제를 연구하고 많은 접근법을 시도했습니다. 당신이 말한대로 package_data작동 bdist하지 않습니다 sdist. 그러나 , MANIFEST.in작동 sdist하지만, 하지bdist! 따라서, 내가 가지고 올 수 있었던 최고의 모두 포함하는 것입니다 package_dataMANIFEST.in모두를 수용하기 위해 bdist과를 sdist.
Wesley Baugh

7
@WesleyBaugh를 지원할 다른 것을 찾았습니다. 에서 stackoverflow.com/a/2969087/261718 , 사용이 MANIFEST.in파일을 사용하면 문서처럼 설치하지 않으며, package_data파일 당신은 (이미지 또는 템플릿 등)이있는 것은 아닙니다 파이썬 코드를 사용합니다.
Drake Guan

12
나는 sdist을 사용하고 모두 포함했다하고 MANIFEST.in package_data . MANIFEST.in배포판에 포함되는 것을 제어하고 package_data는 설치 중에 site_packages 디렉토리로 복사되는 것을 제어합니다. 혼란스럽게도 경로 MANIFEST.in는 setup.py의 위치와 package_data관련이 있으며 개별 패키지 (예 : 모듈) 루트와 관련이 있습니다.
Edward Newell

9
"버전 2.7에서 변경 : 템플릿이 제공되지 않으면 package_data와 일치하는 모든 파일이 MANIFEST 파일에 추가됩니다. 배포 할 파일 지정을 참조하십시오." distutils에서 . 따라서 기존 MANIFEST.in 파일이없고 2.7 이상을 사용하는 경우에만 파일 의 동작이 package_dataZIP에 자동으로 포함되는 것을 볼 수 있습니다 .
Johnus

29
진지하게, 나는이 표가 setuptools를 사용하고 그들이 인생에서 발견 한 끔찍한 곳을 발견하는 사람들을위한 그룹 치료 세션 인 것 같습니다.
매트 조이스

32

방금이 같은 문제가있었습니다. 해결책은 단순히 제거하는 것이 었습니다include_package_data=True .

여기서 읽은 후에 는 이름에서 알 수 있듯이 "패키지 데이터 포함"과 달리 버전 제어의include_package_data 파일을 포함 하는 것을 목표로 삼았습니다. 문서에서 :

include_package_data의 데이터 파일은 CVS 또는 Subversion 제어에 있어야합니다.

...

포함 된 파일을보다 세밀하게 제어하려면 (예를 들어, 패키지 디렉토리에 문서 파일이 있고 설치에서 제외하려는 경우) package_data키워드 를 사용할 수도 있습니다 .

그 주장을 꺼내는 것은 그것을 고쳤습니다. 우연히도 distutils로 바꾸었을 때도 그 주장을 받아들이지 않기 때문에 그것이 효과가 있었던 이유입니다.


2
나의 경험은 다르다. 나는 include_package_data=True입장 을 포함하지 않고 같은 문제를 겪었다 . 나에게 유일한 해결책은 위에서 제안한 것처럼 Manifest에 항목을 추가하는 것입니다. setuptools를 사용하고 있습니까? 아마 버전이 '배포'와 호환됩니까?
TimStaley

4
제거 왜 실제 이유 include_package_data로 해결할 수있는 문제가하면 더욱이다 원문 - setuptools에 별을 사용하는 경우 include_package_data인수에 의해 지정된 파일은 package_data그들이에 표시되지 않는 한 자동으로 매니페스트에 추가되지 않습니다 MANIFEST.in파일.
Piotr Dobrogost

package_data비어 있지 않은 목록으로 설정하고 지정 하는 사용 사례는 무엇입니까 include_package_data=False? 그리고 왜 당신은 두 번 파일을 지정해야 MANIFEST.in하고 package_data?
허버트

21

@Joe의 권고에 따라 include_package_data=True라인 을 제거하는 것도 나에게 효과적 이었습니다.

좀 더 자세히 설명하기 위해 파일 이 없습니다 MANIFEST.in . CVS가 아닌 Git을 사용합니다.

리포지토리는 다음과 같은 형태를 취합니다.

/myrepo
    - .git/
    - setup.py
    - myproject
        - __init__.py
        - some_mod
            - __init__.py
            - animals.py
            - rocks.py
        - config
            - __init__.py
            - settings.py
            - other_settings.special
            - cool.huh
            - other_settings.xml
        - words
            - __init__.py
            word_set.txt

setup.py:

from setuptools import setup, find_packages
import os.path

setup (
    name='myproject',
    version = "4.19",
    packages = find_packages(),  
    # package_dir={'mypkg': 'src/mypkg'},  # didnt use this.
    package_data = {
        # If any package contains *.txt or *.rst files, include them:
        '': ['*.txt', '*.xml', '*.special', '*.huh'],
    },

#
    # Oddly enough, include_package_data=True prevented package_data from working.
    # include_package_data=True, # Commented out.
    data_files=[
#               ('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
        ('/opt/local/myproject/etc', ['myproject/config/settings.py', 'myproject/config/other_settings.special']),
        ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'cool.huh')]),
#
        ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'other_settings.xml')]),
        ('/opt/local/myproject/data', [os.path.join('myproject/words', 'word_set.txt')]),
    ],

    install_requires=[ 'jsonschema',
        'logging', ],

     entry_points = {
        'console_scripts': [
            # Blah...
        ], },
)

python setup.py sdist소스 배포를 위해 실행 합니다 (바이너리를 시도하지 않았습니다).

그리고 새로운 가상 환경 내부에 myproject-4.19.tar.gz, 파일이 있고

(venv) pip install ~/myproject-4.19.tar.gz
...

그리고 내 가상 환경에 설치되는 모든 것 외에도 site-packages이러한 특수 데이터 파일이 /opt/local/myproject/data및에 설치됩니다 /opt/local/myproject/etc.


16

include_package_data=True 나를 위해 일했다.

당신이 자식 사용하는 경우 포함하도록 기억 setuptools-git에서 install_requires. Manifest모든 경로를 포함하거나 포함 하는 것보다 훨씬 지루하지 않습니다 package_data(제 경우에는 모든 종류의 정적을 가진 장고 응용 프로그램입니다)

( k3-rnc가 언급했듯이 실제로 작성한 의견을 붙여 넣었습니다. )


7

업데이트 :이 답변은 오래되었으며 정보는 더 이상 유효하지 않습니다. 모든 setup.py 구성은을 사용해야합니다 import setuptools. https://stackoverflow.com/a/49501350/64313 에서 더 완전한 답변을 추가했습니다.


distutils로 전환하여이 문제를 해결했습니다. 배포가 더 이상 사용되지 않거나 파손 된 것 같습니다.

from distutils.core import setup

setup(
   name='myapp',
   packages=['myapp'],
   package_data={
      'myapp': ['data/*.txt'],
   },
)

2
배포는 더 이상 사용되지 않으며 distutils를 대체 합니다. 왜 문제가 있었는지 모르겠지만 그 이유는 아닙니다.
agf

1
그것이 제가 IRC로부터받은 응답 이었으므로 누가 믿습니까? 배포를 사용하는 실제 예제가 있다면 감사하겠습니다.
cmcginty

6
설명 : 배포는 setuptools를 대체하기위한 것이며 둘 다 distutils 위에 빌드됩니다. distutils 자체는 결국 python2에서는 "distutils2", python3에서는 "packaging"이라는 새로운 패키지로 대체 될 것입니다.
Kevin Horn

1
distutils로 전환하면 include_package_data=True영광 스럽지 않은 문제가 해결 되었습니다. 따라서 해당 설정을 사용하면 MANIFEST.in 만 필요 package_data합니다. 설정 에서 파일 목록을 복제 할 필요가 없습니다 .
Daniel Sokolowski

4

고대의 질문과 파이썬 패키지 관리는 실제로 많은 것을 남겨 둡니다. 그래서 pip를 사용하여 지정된 디렉토리에 로컬로 설치하는 유스 케이스가 있었고 package_data 및 data_files 경로가 모두 작동하지 않는 것에 놀랐습니다. repo에 또 다른 파일을 추가하는 데 관심이 없었으므로 data_files 및 setup.py 옵션 --install-data를 활용했습니다. 이 같은

pip install . --install-option="--install-data=$PWD/package" -t package  


3

나는 며칠 동안 같은 문제가 있었지만이 스레드조차도 모든 것이 혼란스러워서 나를 도울 수 없었습니다. 그래서 나는 연구를하고 다음 해결책을 찾았습니다.

이 경우 기본적으로 다음을 수행해야합니다.

from setuptools import setup

setup(
   name='myapp',
   packages=['myapp'],
   package_dir={'myapp':'myapp'}, # the one line where all the magic happens
   package_data={
      'myapp': ['data/*.txt'],
   },
)

전체 다른 stackoverflow 답변은 여기에


이것을 시도했지만 여전히 아무것도 복사되지 않습니다.
gerrit

3

그냥 줄을 제거하십시오 :

include_package_data=True,

설정 스크립트에서 잘 작동합니다. (지금은 최신 설정 도구로 테스트했습니다.)


그것은 미친하지만 모두와 작동 sdist하고 bdist_wheel, 그 이유를 확인했다?
Szabolcs

1
이것이 설정되면 sdist무시 한다는 것을 실제로 확인할 수 있습니다 package_data.
샌더 스테판

이 시점에서 몇 달이 지났지 만 코드를 파고 두 번 잃어 버렸고 문서에 극도로 미세한 빗질을 가지고 만족을 얻었습니다. 분명히 다양한 샘플 스크립트에이 플래그가 포함되어 있으며 두통을 유발하지 않습니다.
이안

1

setup.cfg 사용 (setuptools ≥ 30.3.0)

setuptools 30.3.0 (2016-12-08 릴리스)부터 setup.py매우 작게 유지 하고 구성을 setup.cfg파일 로 옮길 수 있습니다 . 이 방법을 사용하면 패키지 데이터를 [options.package_data]섹션 에 넣을 수 있습니다 .

[options.package_data]
* = *.txt, *.rst
hello = *.msg

이 경우 setup.py다음과 같이 짧을 수 있습니다.

from setuptools import setup
setup()

자세한 정보는 setup.cfg 파일을 사용하여 설정 구성을 참조하십시오 .

비하하는 몇 가지 이야기setup.cfg 의 찬성 pyproject.toml으로 제안 된 PEP (518)는 , 그러나 이것은 여전히 2020년 2월 21일의로 잠정이다.


이 답변은 MANIFEST 파일을 언급하지 않으므로 실제로는 sdist와 함께 작동하지 않을 것이라고 생각합니다. 바퀴 만. 당신은 그것을 언급해야합니다.
wim

@wim 나는 MANIFEST, sdist 및 wheels에 대한 이해가 충분하지 않습니다. 이것은을 사용하여 나를 위해 일했습니다 pip install.
gerrit

때문이다 pip install핍의 현대 충분한 버전을 먼저 휠을 구축하고 그 설치됩니다. 여전히 많은 사용자에게이 방법은 패키지 데이터를 자동으로 포함하지 못합니다. 이에 대한 자세한 내용은 허용되는 답변과 그 아래에있는 의견을 참조하십시오. 를 사용하는 setup.cfg것은 setup.py질문 에서 OP가 이미 수행 한 작업을 작성하는 것과 다른 방법입니다 ( package_data호출에 키워드 인수를 전달하여 setup) . 이 질문에 대한 답변으로 특히 도움이되지 않는다고 생각합니다 . 근본적인 문제를 전혀 다루지 않습니다.
wim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.