source

패키지 데이터를 설정 도구/디스트리뷰트와 함께 포함하는 방법은 무엇입니까?

manysource 2023. 7. 19. 21:25

패키지 데이터를 설정 도구/디스트리뷰트와 함께 포함하는 방법은 무엇입니까?

설치 도구를 사용할 때 설치 프로그램에서 파일을 가져올 수 없습니다.제가 읽은 모든 것은 다음과 같은 것이 그것을 하는 것이라고 말합니다.누가 조언 좀 해주시겠어요?

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

myapp/data/는 데이터 파일의 위치입니다.

저는 이것이 오래된 질문이라는 것을 알지만, 구글을 통해 여기로 오는 길을 찾는 사람들을 위해:package_data비열하고 더러운 거짓말입니다.바이너리 패키지를 빌드할 때만 사용됩니다(python setup.py bdist ...하지만 소스 패키지를 구축할 때는 그렇지 않습니다(python setup.py sdist ...물론 이것은 말도 안되는 일입니다. 소스 배포판을 구축하면 파일 모음이 다른 사람에게 전송되어 이진 배포판을 구축할 수 있을 것이라고 예상할 수 있습니다.

어떤 경우에도 사용은 이진 분포와 원본 분포 모두에서 작동합니다.

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

여기를 읽고 난 후에, 나는 깨달았다,include_package_data이름이 암시하는 것처럼 단순히 "패키징된 패키지 데이터"가 아닌 버전 제어에서 파일을 포함하는 것을 목표로 합니다.문서에서:

[include_package_data]의 데이터 파일은 CVS 또는 하위 버전 제어 하에 있어야 합니다.

...

된 파일을 파일이 ) " " " " " " (" " " " " " " " " " " " " 을 ." " " " " " )package_data키워드

그 주장을 빼낸 것이 그것을 고쳤고, 이것이 공교롭게도 당신이 논쟁으로 전환했을 때 그것이 효과가 있었던 이유입니다. 왜냐하면 그것은 그 주장을 받아들이지 않기 때문입니다.

@Joe의 권장 사항에 따라 다음을 제거합니다.include_package_data=True라인 또한 저에게 효과가 있었습니다.

좀 더 자세히 말하자면, 저는 없습니다. MANIFEST.inCVS가 아닌 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.

include_package_data=True저를 위해 일했습니다.

git을 사용할 경우 다음을 포함해야 합니다.setuptools-gitinstall_requires그것을 갖는 것보다 훨씬 덜 지루합니다.Manifest 또는모경포함에 경로를 package_data (내우에는모다경니 든 짱 통 앱 있 입 고 는 가 계 종 의 류 ▁with)▁(니다앱입(내짱▁all

(K3-rnc가 언급한 대로 제가 작성한 의견을 붙여 넣었습니다.)

setup.cfg 사용(setuptools ≥ 30.3.0)

30릴리스)부터는 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 파일을 사용하여 설치 구성을 참조하십시오.

에 찬성하는 것을 비난하는 이야기가 있습니다.pyproject.tomlPEP 518에서 제안된 바와 같이, 그러나 이것은 2020-02-21 현재 여전히 잠정적입니다.

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


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

from distutils.core import setup

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

저는 며칠 동안 같은 문제를 겪었지만, 이 스레드조차도 모든 것이 혼란스러웠기 때문에 저를 도울 수 없었습니다.그래서 저는 조사를 했고 다음과 같은 해결책을 찾았습니다.

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

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'],
   },
)

전체 다른 스택 오버플로 응답은 여기에 있습니다.

저는 같은 문제에 걸려 있다가 이 게시물을 발견했습니다.

제 경험은 다른 답변의 경험과 모순됩니다. include_package_data=True bdist에 데이터가 포함됩니다!의 설명은 다음과 같습니다.setuptools 문서에는 컨텍스트 및 문제 해결 팁이 없습니다.include_package_data광고대로 작동합니다.

내 설정:

  • 윈도 / Cygwin
  • git 버전 2.21.0
  • Python 3.8.1 Windows 배포
  • setuptoolsv47.3.1
  • check-manifestv0.42

여기 저의 사용법 안내서가 있습니다.

패키지 데이터를 포함하는 방법

여기 제가 PyPI에 게시한 프로젝트의 파일 구조가 있습니다.(애플리케이션을 설치하는 위치)__main__.py).

├── LICENSE.md
├── MANIFEST.in
├── my_package
│   ├── __init__.py
│   ├── __main__.py
│   └── _my_data          <---- folder with data
│       ├── consola.ttf   <---- data file
│       └── icon.png      <---- data file
├── README.md
└── setup.py

출발점

다음은 다음과 같은 일반적인 시작 지점입니다.setuptools.setup()setup.py.

setuptools.setup(
    ...
    packages=setuptools.find_packages(),
    ...
)

setuptools.find_packages()배포에 모든 패키지가 포함됩니다.는 나의유패키는지한입니다.my_package.

데이터가 인 내이데하위폴더있는,_my_dataPython은 패키지가 포함되어 있지 않으므로 패키지로 간주되지 않습니다.__init__.py ㅠㅠfind_packages()찾을 수 없습니다.

자주 인용되지만 잘못된 해결책은 빈칸을 넣는 것입니다.__init__.py에 파일을 합니다._my_data폴더를 누릅니다.

이렇게 하면 패키지가 되므로 폴더가 포함됩니다._my_data유통 중에하지만 안에 있는 데이터 파일은_my_data포함되지 않습니다.

만들기 ㅠㅠㅠ_my_data패키지에 넣는 은 도움이 되지 않습니다.

솔루션은 다음과 같습니다.

  • 그자리의 sdist에는 이미 되어 있습니다.
  • 더하다include_package_data=True을 데터파니다에 합니다.bdist뿐만 아니라.

실험(용액 테스트 방법)

이 실험을 반복 가능하게 하는 세 단계는 다음과 같습니다.

$ rm -fr build/ dist/ my_package.egg-info/
$ check-manifest
$ python setup.py sdist bdist_wheel

다음과 같은 사항을 단계별도로 설명하겠습니다.

  1. 이전 빌드를 정리합니다.
$ rm -fr build/ dist/ my_package.egg-info/
  1. 려달을 합니다.check-manifestMANIFEST.in 버전 제어 아래에 있는 파일의 Git 인덱스와 일치합니다.
$ check-manifest

한다면MANIFEST.in아직 존재하지 않습니다. 버전 제어 하에 있는 파일의 Git 인덱스에서 생성하십시오.

$ check-manifest --create

에 여기다니습있이 있습니다.MANIFEST.in생성된 데이터:

include *.md
recursive-include my_package *.png
recursive-include my_package *.ttf

이 파일을 수동으로 편집할 이유가 없습니다.

버전 제어 하에 있어야 하는 모든 것이 버전 제어 하에 있는 한(즉, Git 인덱스의 일부),check-manifest --create옳은 일을 합니다.

참고: 다음 중 하나에 해당하는 파일은 Git 인덱스의 일부가 아닙니다.

  • 에서 됩니다..gitignore
  • 서에제에서 됩니다..git/info/exclude
  • 또는 아직 인덱스에 추가되지 않은 새 파일일 입니다.

그리고 만약 어떤 파일이 버전 관리 하에 있으면, 그것은 버전 관리 에 있어서는 안 됩니다.check-manifest경고를 발행하고 Git 인덱스에서 제거할 것을 권장하는 파일을 지정합니다.

  1. 빌드:
$ python setup.py sdist bdist_wheel

자, 그럼 이제 '이검니다합사'를 살펴보도록 .sdist 분포)및 (소스 분포) »bdist_wheel) 데이터 파일이 포함되어 있는지 확인합니다.

의 .sdist(아래에는 관련 라인만 나와 있습니다):

$ tar --list -f dist/my_package-0.0.1a6.tar.gz
my_package-0.0.1a6/
...
my_package-0.0.1a6/my_package/__init__.py
my_package-0.0.1a6/my_package/__main__.py
my_package-0.0.1a6/my_package/_my_data/
my_package-0.0.1a6/my_package/_my_data/consola.ttf <-- yay!
my_package-0.0.1a6/my_package/_my_data/icon.png    <-- yay!
...

그래서 그sdist이 에으나있데파이일미있포습에 되어 있기 이 포함되어 있습니다.MANIFEST.in을 데터파포위추없작다습니에 로 할 일은 .sdist.

의 .bdist은 .구문 됩니다.zip 파일은 .zip 파일입니다.)zipfile.ZipFile):

$ python check-whl.py
my_package/__init__.py
my_package/__main__.py
my_package-0.0.1a6.dist-info/LICENSE.md
my_package-0.0.1a6.dist-info/METADATA
my_package-0.0.1a6.dist-info/WHEEL
my_package-0.0.1a6.dist-info/entry_points.txt
my_package-0.0.1a6.dist-info/top_level.txt
my_package-0.0.1a6.dist-info/RECORD

만의: 만들어야 .check-whl.py스크립트를 사용하여 위의 출력을 생성합니다.단지 세 줄입니다.

from zipfile import ZipFile
path = "dist/my_package-0.0.1a6-py3-none-any.whl" # <-- CHANGE
print('\n'.join(ZipFile(path).namelist()))

시역.bdist데이터 파일이 없습니다.

_my_data폴더가 완전히 없습니다.

다음을 생성하면 어떻게 됩니까?_my_data/__init__.py실험을 반복했는데 데이터 파일이 아직 없습니다!_my_data/폴더는 포함되어 있지만 데이터 파일은 포함되어 있지 않습니다!

해결책

다른 사람들의 경험과는 달리, 이것은 효과가 있습니다.

setuptools.setup(
    ...
    packages=setuptools.find_packages(),
    include_package_data=True, # <-- adds data files to bdist
    ...
)

고정 장치를 사용하여 실험을 다시 수행합니다.

$ rm -fr build/ dist/ my_package.egg-info/
$ check-manifest
$ python.exe setup.py sdist bdist_wheel

다음을 확인합니다.sdist여전히 데이터 파일이 있습니다.

$ tar --list -f dist/my_package-0.0.1a6.tar.gz
my_package-0.0.1a6/
...
my_package-0.0.1a6/my_package/__init__.py
my_package-0.0.1a6/my_package/__main__.py
my_package-0.0.1a6/my_package/_my_data/
my_package-0.0.1a6/my_package/_my_data/consola.ttf <-- yay!
my_package-0.0.1a6/my_package/_my_data/icon.png    <-- yay!
...

의 .bdist:

$ python check-whl.py
my_package/__init__.py
my_package/__main__.py
my_package/_my_data/consola.ttf        <--- yay!
my_package/_my_data/icon.png           <--- yay!
my_package-0.0.1a6.dist-info/LICENSE.md
my_package-0.0.1a6.dist-info/METADATA
my_package-0.0.1a6.dist-info/WHEEL
my_package-0.0.1a6.dist-info/entry_points.txt
my_package-0.0.1a6.dist-info/top_level.txt
my_package-0.0.1a6.dist-info/RECORD

데이터 파일이 포함되어 있는지 테스트하지 않는 방법

위에서 개략적으로 설명한 접근 방식을 사용하여 문제 해결/테스트를 수행하여 테스트할 것을 권장합니다.sdist그리고.bdist.

편집 가능한 모드의 pip 설치는 올바른 테스트가 아닙니다.

참고:pip install -e . 데이터 파일이 포함되어 있는지 여부가 표시되지 않습니다.bdist.

심볼 링크를 사용하면 데이터 파일이 이미 개발자의 컴퓨터에 로컬로 존재하기 때문에 설치가 데이터 파일이 포함된 것처럼 동작합니다.

나 뒤에pip install my_package의 데터파환에 있습니다.lib/site-packages/my_package/의 한 파일 합니다.whl내용물.

TestPy에 게시PI는 테스트를 위한 느린 방법입니다.

TestPyTestPy게시PI조회합니다.lib/site-packages/my_packages유효한 테스트이지만 시간이 너무 많이 걸립니다.

오래된 질문이지만...파이썬의 패키지 관리는 정말 부족한 점이 많습니다.그래서 pip을 사용하여 지정된 디렉토리에 로컬로 설치하는 사용 사례가 있었는데 package_data 경로와 data_files 경로가 모두 작동하지 않는 것에 놀랐습니다.저는 레포에 다른 파일을 추가하고 싶지 않아서 결국 data_files와 setup.py 옵션 --install-data를 활용하게 되었습니다. 이런 식입니다.

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

이 스레드의 다른 사람들처럼, 저는 장수와 여전히 명확성이 부족한 조합에 조금 이상으로 놀랐지만, 저에게 가장 좋은 대답은 다음과 같습니다.check-manifest://http://esponse의 와 같이.

그래서, 단지 a를 사용합니다.setup.cfg 니요는 없습니다.setup.py패키지에 필요한 추가 텍스트 및 파이썬 파일을 setup.cfg:

[options]
packages = find:
include_package_data = true

MANIFEST.in에의여하에 check-manifest출력:

include *.in
include *.txt
include *.yml
include LICENSE
include tox.ini
recursive-include mypkg *.py
recursive-include mypkg *.txt

패키지 데이터가 들어 있는 폴더를 모듈 폴더로 이동하여 문제를 해결했습니다.

다음 질문을 참조하십시오. "MANIFEST.in 설치 실패"에서 setup.py 이 무시되었습니다. 데이터 파일이 설치되지 않았습니까?

선을 제거하기만 하면 됩니다.

include_package_data=True,

설정 스크립트에서 사용할 수 있습니다.(방금 최신 설정 도구로 테스트됨)

다음과 같은 디렉토리 구조의 경우:

foo/
├── foo
│   ├── __init__.py
│   ├── a.py
│   └── data.txt
└── setup.py

그리고.setup.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from setuptools import setup


NAME = 'foo'
DESCRIPTION = 'Test library to check how setuptools works'
URL = 'https://none.com'
EMAIL = 'gzorp@bzorp.com'
AUTHOR = 'KT'
REQUIRES_PYTHON = '>=3.6.0'

setup(
    name=NAME,
    version='0.0.0',
    description=DESCRIPTION,
    author=AUTHOR,
    author_email=EMAIL,
    python_requires=REQUIRES_PYTHON,
    url=URL,
    license='MIT',
    classifiers=[
        'Programming Language :: Python',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.6',
    ],
    packages=['foo'],
    package_data={'foo': ['data.txt']},
    include_package_data=True,
    install_requires=[],
    extras_require={},
    cmdclass={},
)

python setup.py bdist_wheel작동하다.

Setuptools 62.3.0부터는 이제 재귀 와일드카드를 사용할 수 있습니다."**"(하위) 디렉터리를 재귀적으로 포함합니다.이렇게 하면 모든 폴더와 파일이 포함된 전체 폴더를 포함할 수 있습니다.

를 들어, 를들어를 때, 를사할때를 합니다.pyproject.toml다음과 같이 두 개의 폴더를 재귀적으로 포함할 수 있습니다.

[tool.setuptools.package-data]
"ema_workbench.examples.data" = ["**"]
"ema_workbench.examples.models" = ["**"]

그러나 특정 파일 형식만 폴더 및 모든 하위 폴더에 포함할 수 있습니다. 마크다운markdown)을 과 같이 ..md예는 다음과 같습니다.

[tool.setuptools.package-data]
"ema_workbench.examples.data" = ["**/*.md"]

▁when를 사용할 때도 해야 합니다.setup.py또는setup.cfg.

자세한 내용은 https://github.com/pypa/setuptools/pull/3309 를 참조하십시오.

언급URL : https://stackoverflow.com/questions/7522250/how-to-include-package-data-with-setuptools-distutils