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


200

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

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


지금은 어떻게합니까? 이전 질문은 라이센스 파일을 추가하는 방법에 익숙하다는 것을 나타내므로 "작동하지 않는"코드는 무엇입니까?
SilentGhost

2
data_files = [('', ['lgpl2.1_license.txt',]),]Python26 폴더에 넣습니다.
Ram Rachum

부정적인 피드백을받은 후 다시 질문을 읽고 누락 된 내용을 깨달았습니다. 추가 모듈 (예 : setuptools 또는 배포)이 필요없는 귀하의 질문에 해킹이 아닌 솔루션을 제공하기 위해 답변을 업데이트했습니다.
Evan Plaice

고마워 Evan. 그러나 setuptools를 사용하면 완벽하게 사용할 수 있습니다.
Ram Rachum

답변:


224

이 작업을 수행하는 가장 좋은 방법은 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(). 자세한 내용은 비 코드 파일 추가 를 참조하십시오.


5
package_data는 Python 2.3 이후 순수 distutils 설정 스크립트에서도 사용할 수 있습니다.
Éric Araujo

15
이 답변은 합리적으로 보이지만 나에게는 효과가 없습니다. package_data가 신뢰할 수없는 것으로 악명 높기 때문에 (MANIFEST.in과 setup.py를 조정하여 sdist에 파일을 추가하고 별도의 단계로 파일을 설치해야 함)이 답변의 작성자는 "테스트되지 않았습니다"라는 메시지를 누구나 볼 수 있습니다. 그렇지 않은 경우 확인하십시오. 나는 "파이썬 setup.py 설치"이나 "패키지를 설치 PIP"를 실행하면 내 라이센스 파일을 설치 sdist에 포함되지 않지만,
조나단 하틀리

11
Ian Bicking의 프레젠테이션은 패키지 내에있는 파일의 패키지 데이터를 설치하는 방법 만 보여줍니다. 내 LICENSE 파일은 프로젝트의 최상위 레벨에 있습니다 (예 : 패키지가 아님). package_data를 계속 사용할 수 있습니까? data_files를 사용하는 것은 시스템 전체 위치에 파일을 저장하기 때문에 시작이 아닙니다. 내 프로젝트와 관련이 없으며 더 악화시키기 위해 동일한 sdist에서 "setup.py install"또는 "pip install"을 실행하는지에 따라 위치가 변경됩니다.
조나단 하틀리

8
이 저장소의 최상위에있는 라이센스 파일, 그리고 따라서 'package_data'를 사용하여 설치할 수 없습니다 - 나는 그것이 않는 이유는 내가 아닌 작업 파일이 어떤 패키지에 위치하지 않은 것입니다 같은데요
Jonathan Hartley

7
이 답변은 저에게 효과적이지 않습니다. 추가 파일은 tarball에 들어 가지 않습니다 ...
lpapp

44

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

  • 파일을 소스 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'])]

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


10
MANIFEST는 소스 tarball에 포함 된 제어 파일 (sdist에서 생성) 만 제어합니다. 여기에 나열된 파일은 설치되지 않습니다.
David Cournapeau

@David 나는 첫 접근 방식이 얼마나 멀리 떨어져 있는지 몰랐습니다. 추가 타사 라이브러리를 요구하지 않고 질문에 대한 답변을 얻을 수 있도록 답변을 업데이트했습니다.
Evan Plaice

3
@ Éric 왜 특별한 이유가 있습니까? 그리고 setup_tools와 같은 타사 패키지가 필요하지 않은 실행 가능한 설치 프로그램 대안이 있습니까? python의 바닐라 설치에 포함되어 있기 때문에 setuptools 대신 distutils를 선택했으며 PYPI 용 모듈을 작성했습니다. distutils2를 사용 하여이 작업을 수행하는 더 좋은 방법이 있어야하지만 파이썬을 꽤 오랫동안 만지지 않았으므로 어떻게 알지 못합니다. distutils2에 대해 잘 아는 것 같아서 다른 사람들에게 적절한 distutils2 대안이 있으면 도움이 될 것이라고 생각합니다.
Evan Plaice

6
다른 스레드에서 언급했듯이 package_data파일이 패키지에 없으면 작동하지 않습니다.
Gringo Suave

2
@ ÉricAraujo : 다른 방법이 없기 때문에이 솔루션을 사용하는 것은 좋지 않습니다. 나쁜 distutils 디자인입니다-사실입니다. 그러나 실제로 공개 API는 변경되지 않으므로 많은 것들이 깨질 것입니다. distutils2가 더 나은 권장 방법을 제공하기를 바랍니다.
anatoly techtonik 2012 년


7

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

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

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

include_package_data: False

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

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

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


나는를 만들 필요가없는 방법을 찾고 있었는데 MANIFEST.in이것은 나를 위해 일했다. 마지막 줄도 나에게 중요했습니다. 내 줄은include_package_data=False, package_data={ "": ["../CHANGELOG.md"] },
Mendhak

7

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

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

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

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

참조가 여기 있습니다.


6

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"을 사용하는 경우에는 신경 쓰지 않아도됩니다. 그러나 프로그램의 중요한 파일은 뒤에 일이 다소 중요하다)


5

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
   },

1
이것은 실제로 OP의 목표를 달성하는 데 아무런 영향을 미치지 않습니다. 당신의 쓰기 무엇 이건 package_data무엇에 아무런 영향을주지 않습니다 setup.py install당신이 설치 명령 자체를 수정하지,하지 않는 한을. 이러한 파일이 패키지 디렉토리에 있지 않으면 일반적으로 피하고 싶은 것입니다.
wvxvw

3

나를 위해 일한 더 간단한 대답이 있습니다.

먼저, 위의 Python Dev의 의견에 따라 setuptools가 필요하지 않습니다.

package_data is also available to pure distutils setup scripts 
since 2.3.  Éric Araujo

패키지에 setuptools 요구 사항을 넣으면 패키지를 설치해야하기 때문에 좋습니다. 한마디로 :

from distutils.core import setup

setup(
    # ...snip...
    packages          = ['pkgname'],
    package_data      = {'pkgname': ['license.txt']},
)

1
디렉토리 pkgame가 존재하지 않는다고 불평 합니다
Anthony Kong

1

Centos 6에서 Python 2.7을 사용하여 찾은 것을 추적하고 싶었습니다. 위에서 언급 한 것처럼 package_data 또는 data_files를 추가해도 효과가 없었습니다. 파이썬이 아닌 파일을 tarball에 넣는 파일과 함께 MANIFEST.IN을 추가했지만 RPM을 통해 대상 컴퓨터에 설치하지 않았습니다.

결국 setup / setuptools의 "options"를 사용하여 파일을 솔루션으로 가져올 수있었습니다. 옵션 파일을 사용하면 setup.py에서 사양 파일의 다양한 섹션을 수정할 수 있습니다. 다음과 같이.

from setuptools import setup


setup(
    name='theProjectName',
    version='1',
    packages=['thePackage'],
    url='',
    license='',
    author='me',
    author_email='me@email.com',
    description='',
    options={'bdist_rpm': {'install_script': 'filewithinstallcommands'}},
)

파일-MANIFEST.in :

include license.txt

file-설치 명령이있는 file :

mkdir -p $RPM_BUILD_ROOT/pathtoinstall/
#this line installs your python files
python setup.py install -O1 --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES
#install license.txt into /pathtoinstall folder
install -m 700 license.txt $RPM_BUILD_ROOT/pathtoinstall/
echo /pathtoinstall/license.txt >> INSTALLED_FILES

-12

해결 방법을 알아 냈 : 나는 나의 이름 lgpl2.1_license.txtlgpl2.1_license.txt.py, 텍스트 주위에 약간의 삼중 따옴표를 넣어. 이제 data_files옵션을 사용하거나 절대 경로를 지정할 필요가 없습니다 . 파이썬 모듈로 만드는 것은 추한 일이지만 절대 경로를 지정하는 것보다 덜 추한 것으로 생각합니다.


7
내 게시물을 참조하십시오. 추악 할 필요는 없습니다. 패키지 설정에 대한 좋은 문서를 찾기가 어렵 기 때문에 인터넷에서 좋은 예를 찾기가 어렵습니다.
Evan Plaice
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.