programing

설정에 비 Python 파일 포함.화이

goodcopy 2022. 10. 27. 22:15
반응형

설정에 비 Python 파일 포함.화이

만드방방은 하면 만들 수 요?setup.py(구체적으로는 라이선스파일이지만 다른 파일일 수도 있습니다).

나는 파일의 위치를 제어할 수 있기를 원한다.수준(즉, 최상위 )(즉,__init__.pysystem.operating system의 인스톨시에, operating system, operating system, operating system, operating system, operating system, operating system, operating system, operating system, operating system에 관계없이, system, operatus, 걸걸어 떻떻? ???

가장 은 '이것'을 입니다.setuptools package_data지시.즉, (또는 )를 사용하는 것입니다.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_data는 입니다.dict패키지 이름(빈 = 모든 패키지)을 패턴 목록(글로브 포함)으로 이동합니다.예를 들어 패키지 내에서 파일만 지정하려면 다음과 같이 지정할 수 있습니다.

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

여기서의 해결책은, 절대로, 다음의 이름을 바꾸지 않는 것입니다.py with with가 붙은 .py내선 번호

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

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

배포의 또 하나의 (「」)이 있습니다.sdist에 있는 들어 디렉토리은, 「상위 의 디렉토리」를 하는 것입니다.MANIFEST.in파일. 이 파일의 형식은 Python 문서를 참조하십시오.

쓴후, 저는 이 글을 쓴 후에, 이 글을 쓴다는 .MANIFEST.in는, 은, (송신원의 만으로, 않은 입니다.tar.gz한 파일이 에 필요한 파일이 있습니다.

를 들어, '를 '아예'를 넣어야 합니다.requirements.txt톱 레벨의 「합니다.

include requirements.txt
recursive-include data *

패키지내의 하려면 , 「」를 .include_package_data=Truesetup()기능.자세한 내용은 비코드 파일 추가를 참조하십시오.

당신이 설명한 것을 달성하려면 두 가지 단계를 거쳐야 합니다...

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

순서 1: 파일을 소스 tarball에 추가하려면 파일을 MANIFEST에 포함합니다.

셋업이 포함된 폴더에 매니페스트 템플릿을 만듭니다.화이

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

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

  • CHANGELOG.txt
  • 설치.txt
  • 라이선스.txt
  • pypreprocessor.화이
  • README.txt
  • setup.py
  • test.py
  • TODO.txt

주의: sdist일부 파일을 자동으로 추가합니다만, 저는 sdist가 무엇을 하고 무엇을 하지 않는지를 예측하기보다는 확실하게 지정하기를 원합니다.

순서 2: 데이터 파일을 소스 폴더에 설치하려면 설정을 변경합니다.화이

원본 설치 폴더에 데이터 파일(LICESS.txt)을 추가하는 경우 원본 설치 경로에 맞게 데이터 설치 경로를 변경해야 합니다.기본적으로 데이터 파일은 원본 파일과 다른 위치에 설치되기 때문에 이 작업이 필요합니다.

데이터 설치 dir를 소스 설치 dir와 일치하도록 수정하려면...

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

from distutils.command.install import INSTALL_SCHEMES

데이터 설치 dir를 소스 설치 dir와 일치하도록 변경합니다.

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

다음으로 데이터 파일과 위치를 setup()에 추가합니다.

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

주의: 위의 절차에서는 확장 라이브러리를 필요로 하지 않고 표준적인 방법으로 설명한 대로 수행해야 합니다.

, , 2019년, 2019년, 2019년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년, 2012년,여기저기 조언에도 불구하고 인터넷에서 발견한 것은 중간쯤 문서화되어 있는 것을 사용하고 있습니다.setuptools_scmsetuptools.setup여기에는 VCS에서 버전화된 데이터 파일(git이든 다른 파일이든)이 포함됩니다.설치하다

그래서 이 두 줄을 "setup.py"의 셋업 콜에 추가했습니다.추가 설치 또는 Import 불필요:

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

package_data를 수동으로 나열하거나 MANIFEST.in 파일에 표시할 필요가 없습니다.버전화되어 있는 경우 패키지에 포함되어 있습니다."setuptools_scm"의 문서는 커밋 위치에서 버전 번호를 작성하는 데 중점을 두고 데이터 파일을 추가하는 데 있어 정말 중요한 부분은 무시합니다.(중간 휠 파일의 이름이 "*0.2.2.dev45+g3495a1f"인지, 입력한 하드 코드 버전 번호 "0.3.0dev0"을 사용하는지는 상관없습니다.다만, 중요한 파일을 남겨 두는 것이 중요합니다.)

MANIFEST.in에 "Manager"가 포함되어 있습니다.recursive-include 또는 「」에 합니다.include파일명을 지정합니다.

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

매뉴얼은 이쪽에서 찾을 수 있습니다.

순서 1: 작성MANIFEST.in

순서 2: 추가할 파일의 상대 경로를 포함합니다.MANIFEST.in

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

스텝 3: 설정include_package_data=True setup()

레퍼런스는 이쪽입니다.

질문 중 하나에 코멘트를 투고하고 싶었지만, 그러기엔 평판이 좋지 않습니다.>

다음은 나에게 효과가 있었던 내용입니다(의사 참조 후 해결).

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

include_package_data: False

마지막 행은 이상하게도 저에게도 매우 중요했습니다(이 키워드 인수는 생략할 수 있습니다.동일하게 동작합니다).

루트 됩니다( 「」로부터1 업).mypkg배포하고 싶다).

이게 도움이 됐으면 좋겠네요!

이건 2020년에 효과가 있어!

다른 사람들이 말한 것처럼 setup.py가 있는 곳에 "MANIFEST.in"을 만듭니다.

다음으로는 필요한 모든 것을 포함/제외합니다.구문에 대해서는 여기서 주의해 주세요.예: 소스 패키지에 포함할 템플릿 폴더가 있다고 가정합니다.

매니페스트 파일에서 다음을 수행합니다.

recursive-include template *

위와 같은 파일/dir의 경우 dir-name과 패턴 사이에 공백을 두십시오..gitignore에서처럼 이렇게 하지 마세요.

recursive-include template/* [this won't work]

다른 옵션은 include를 사용하는 것입니다.여러 가지 방법이 있어요.매니페스트에 대한 문서를 찾아봐

그리고 마지막 중요한 단계는 이 파라미터를 setup.py에 포함시키면 바로 사용할 수 있습니다.

   setup(
    ...
    include_package_data=True,
    ......
)

도움이 됐으면 좋겠네요!해피 코딩!

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. 한 바와 같이 - 를 합니다.MANIFEST.in포함할 폴더/파일을 지정합니다.: ★★★★★★★★★★★★★★★★★★:recursive-include folder_with_extra_stuff *
  2. 말씀드린처럼 - 을 더하다 - 을 더하다, 을 더하다 - 을 더하다 - 을 더하다include_package_data=Trueyour setup.py, 것것 that that that . . . . . . . . . . . . . . . . . . 。이것이 없으면 일치하는 파일만*.py가져올 것이다.
  3. 이것이 누락된 것입니다! - 빈칸을 추가합니다.__init__.py데이터 폴더로 이동합니다.저는 이 파일을 제 파일에 추가해야 했습니다.folder-with-extra-stuff.
  4. - 조건인지는 , 내되어 있는 을 알 수 .site-packages 덧붙여야만 했어요.zip_safe=False 나 my my mysetup.pyfilename을 클릭합니다.

최종 디렉토리 구조

my-app/
├─ app/
│  ├─ __init__.py
│  ├─ __main__.py
├─ folder-with-extra-stuff/
│  ├─ __init__.py
│  ├─ data_file.json
├─ setup.py
├─ MANIFEST.in

여기 나에게 효과가 있었던 더 간단한 답이 있다.

첫째, 위의 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']},
)

Centos 6에서 Python 2.7로 작업한 것을 확인하고 싶습니다.위와 같이 package_data 또는 data_files를 추가하는 것은 나에게 효과가 없었습니다.매니페스트를 추가했어python이 아닌 파일을 tarball에 넣고 싶었지만 RPM을 통해 타겟 머신에 설치하지 않았습니다.

결국 셋업/셋업툴의 "옵션"을 사용하여 파일을 솔루션에 가져올 수 있었습니다.옵션 파일을 사용하면 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 with install 명령어:

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

내 파일이 패키지 외부에 있는 최상위 수준이었기 때문에 어떤 답변도 통하지 않았습니다.대신 커스텀 빌드 명령어를 사용했습니다.

import os
import setuptools
from setuptools.command.build_py import build_py
from shutil import copyfile

HERE = os.path.abspath(os.path.dirname(__file__))
NAME = "thepackage"

class BuildCommand(build_py):
    def run(self):
        build_py.run(self)

        if not self.dry_run:
            target_dir = os.path.join(self.build_lib, NAME)
            for fn in ["VERSION", "LICENSE.txt"]:
                copyfile(os.path.join(HERE, fn), os.path.join(target_dir,fn))

 
 
setuptools.setup(
    name=NAME,
    cmdclass={"build_py": BuildCommand},
    description=DESCRIPTION,
    ...
)

설치에 python이 아닌 파일을 포함하려면 설치된 패키지 디렉터리 중 하나에 있어야 합니다.MANIFEST.in 에서 패키지 디렉토리 외부에 비패키지 파일을 지정하면 배포에는 포함되지만 설치되지는 않습니다.패키지 디렉토리 외부에 임의의 파일을 인스톨 하는 「문서화된」방법은, 지금까지 모든 사람이 알고 있듯이, 신뢰성 있게 동작하지 않습니다.

위의 답변은 Julian Mann이 파일을 빌드 디렉토리의 패키지 디렉토리에 복사하기 때문에 동작합니다.단, 편집 가능/개발 모드로 인스톨 하고 있는 경우는 동작하지 않습니다(pip install -e ★★★★★★★★★★★★★★★★★」python setup.py develop관련 질문에 대한 이 답변(및 Julian의 답변)에 따라 다음 예시는 다른 모든 설치/개발 태스크가 완료된 후 설치된 패키지 위치에 파일을 복사하는 것입니다.여기서의 가정은 파일이file1 ★★★★★★★★★★★★★★★★★」file2 의 「」로data된 디렉토리에 됩니다(디렉토리가 인스톨 되어 있는 디렉토리디렉토리)my_package에서 python python 을 사용하여 액세스 할 수os.path.join(os.path.dirname(__file__), 'file1') 등등.

이러한 파일이 배포에 포함되도록 위에서 설명한 MANIFEST.in 작업도 잊지 마십시오.왜 setuptools가 배포에 파일을 포함시키고도 그것들을 사일런트하게 설치하지 않는지 이해할 수 없습니다.패키지 디렉토리 밖에 인스톨 하는 것은, 한층 더 의심스러울지도 모릅니다.

import os
from setuptools import setup
from setuptools.command.develop import develop
from setuptools.command.install import install
from shutil import copyfile

HERE = os.path.abspath(os.path.dirname(__file__))
NAME = 'my_package'

def copy_files (target_path):
    source_path = os.path.join(HERE, 'data')
    for fn in ["file1", "file2"]:
        copyfile(os.path.join(source_path, fn), os.path.join(target_path,fn))

class PostDevelopCommand(develop):
    """Post-installation for development mode."""
    def run(self):
        develop.run(self)
        copy_files (os.path.abspath(NAME))

class PostInstallCommand(install):
    """Post-installation for installation mode."""
    def run(self):
        install.run(self)
        copy_files (os.path.abspath(os.path.join(self.install_lib, NAME)))

setup(
    name=NAME,
    cmdclass={
        'develop': PostDevelopCommand,
        'install': PostInstallCommand,
    },
    version='0.1.0',
    packages=[NAME],
    include_package_data=True,
    setup_requires=['setuptools_scm'],
)

이름.lgpl2.1_license.txt로로 합니다.lgpl2.1_license.txt.py텍스트 주위에 세 개의 따옴표를 붙입니다. 저는 안 될 것 같아요.data_files절대 경로를 지정하지 않습니다.Python 모듈로 만드는 것은 추악한 일이지만 절대 경로를 지정하는 것보다 덜 추하다고 생각합니다.

언급URL : https://stackoverflow.com/questions/1612733/including-non-python-files-with-setup-py

반응형