IT TIP

setup.py 예?

itqueen 2020. 10. 29. 20:19
반응형

setup.py 예?


이 페이지를 공부 한 후 :

http://docs.python.org/distutils/builtdist.html

나는 (페도라 rpm 파일을 만드는 것을 목표로) 내 자신을 만들기 위해 공부할 몇 가지 setup.py 파일을 찾고 싶습니다.

커뮤니티가 좋은 예를 보여줄 수 있습니까?


여기에서setup.py 스크립트 작성에 대한 전체 연습을 수행 하십시오 . (몇 가지 예 포함)

실제 사례를 원하신다면 setup.py몇 가지 주요 프로젝트 스크립트 를 알려 드릴 수 있습니다. Django 's는 여기 , pyglet 's는 여기 입니다. 더 많은 예제를 보려면 setup.py라는 파일의 다른 프로젝트 소스를 찾아 볼 수 있습니다.

이것은 단순한 예가 아닙니다. 내가 준 튜토리얼 링크에는 그것들이 있습니다. 이것들은 더 복잡하지만 더 실용적입니다.


불완전하더라도 HitchHiker 's Guide to Packaging이 도움 이 될 수 있습니다 . 빠른 시작 자습서 부터 시작하겠습니다 . 또한 Python Package Index 에서 Python 패키지 를 검색해보십시오 . tarball을 다운로드하고 압축을 풀고 setup.py파일을 살펴보십시오 . 또는 더 나은 방법은 GitHub 또는 BitBucket에서 호스팅되는 것과 같은 공개 소스 코드 저장소를 나열하는 패키지 만 살펴 보는 것입니다. 첫 페이지에서 하나를 만나게 될 것입니다.

나의 마지막 제안은 그것을 위해 가서 하나를 만드는 것입니다. 실패하는 것을 두려워하지 마십시오. 직접 만들기 시작하기 전까지는 정말 이해하지 못했습니다. PyPI에서 새 패키지를 만드는 것은 간단하고 제거하기도 쉽습니다. 따라서 더미 패키지를 만들고 놀아보십시오.


먼저 읽어보십시오 https://packaging.python.org/en/latest/current.html

설치 도구 권장 사항

  1. pip를 사용하여 PyPI에서 Python 패키지를 설치합니다.
  2. virtualenv 또는 pyvenv를 사용하여 공유 Python 설치에서 애플리케이션 별 종속성을 분리합니다.
  3. 후속 설치 속도를 높이기 위해 pip wheel을 사용하여 휠 배포 캐시를 만듭니다.
  4. 완전히 통합 된 크로스 플랫폼 소프트웨어 스택의 관리를 찾고 있다면 빌드 아웃 (주로 웹 개발 커뮤니티에 집중) 또는 Hashdist 또는 conda (둘 다 주로 과학 커뮤니티에 집중)를 고려하십시오.

패키징 도구 권장 사항

  1. setuptools를 사용하여 프로젝트를 정의하고 소스 배포를 만듭니다.
  2. wheel 프로젝트에서 사용 가능한 bdist_wheel setuptools 확장을 사용하여 바퀴를 만듭니다. 프로젝트에 바이너리 확장이 포함되어있는 경우 특히 유용합니다.
  3. PyPI에 배포 물을 업로드하려면 twine을 사용하십시오.

이 anwser는 노화되었으며 실제로 파이썬 패키징 세계에 대한 구조 계획이 있습니다.

바퀴 방법

나는 여기에 pythonwheels.com을 qoute :

바퀴는 무엇입니까?

바퀴는 파이썬 배포의 새로운 표준이며 계란을 대체하기위한 것입니다. 지원은 pip> = 1.4 및 setuptools> = 0.8에서 제공됩니다.

바퀴의 장점

  1. 순수 Python 및 네이티브 C 확장 패키지를위한 더 빠른 설치.
  2. 설치를위한 임의 코드 실행을 방지합니다. (setup.py 회피)
  3. C 확장을 설치하려면 Windows 또는 OS X에 컴파일러가 필요하지 않습니다.
  4. 테스트 및 지속적인 통합을 위해 더 나은 캐싱을 허용합니다.
  5. 사용 된 python 인터프리터와 일치하는지 확인하기 위해 설치의 일부로 .pyc 파일을 만듭니다.
  6. 플랫폼과 시스템에보다 일관된 설치.

(와 바퀴에 대한) 정확한 파이썬 포장의 전체 이야기에 덮여 packaging.python.org


콘다 방법

과학 컴퓨팅 ( package.python.org 에서도 권장 됨, 위 참조) 의 경우 PyPI 및 pip 도구를 기반으로하는 타사 서비스 빌드로 볼 수있는 CONDA 패키징 사용을 고려할 것 입니다. 또한 자신의 binstar 버전을 설정 하는데도 효과적 이므로 정교한 맞춤형 엔터프라이즈 패키지 관리를위한 트릭을 수행 할 수 있다고 생각합니다.

Conda는 사용자 폴더에 설치할 수 있으며 (슈퍼 사용자 권한 없음) 마법처럼 작동합니다.

콘다 설치

강력한 가상 환경 확장.


계란 방법

이 옵션은 python-distribute.org와 관련이 있으며 사이트뿐만 아니라 훨씬 오래되었으므로 사용할 준비가 된 컴팩트 한 setup.py 예제 중 하나를 알려 드리겠습니다.

  • 스크립트와 단일 파이썬 파일을 setup.py에 혼합하는 매우 실용적인 예제 / 구현이 여기에 있습니다.
  • hyperopt 에서 더 나은 것

이 인용문은 setup.py 상태에 대한 가이드에서 가져 왔으며 여전히 적용됩니다.

  • setup.py가 사라졌습니다!
  • distutils가 사라졌습니다!
  • 사라져 배포!
  • 여기에 pip 및 virtualenv가 있습니다!
  • 계란 ... 사라졌습니다!

하나 더 추가합니다 (나에게서)

  • 바퀴 !

무의미한 복사 붙여 넣기를 시도하기 전에 (gotgenes가 가리키는 가이드에서) 패키징 생태계에 대한 이해를 얻는 것이 좋습니다 .

인터넷에있는 대부분의 예는

from distutils.core import setup

그러나 예를 들어 이것은 에그 파이썬 setup.py bdist_egg (및 다른 일부 오래된 기능) 빌드를 지원하지 않습니다 .

from setuptools import setup

그 이유는 더 이상 사용되지 않기 때문 입니다.

이제 가이드에 따르면

경고

이 패키지에는 수정할 수있는 문제와 해결되지 않을 문제가 있으므로 Setuptools 패키지 대신 배포 패키지를 사용하십시오.

더 이상 사용되지 않는 setuptools는 "Python 3.3에서 표준 라이브러리의 일부가 될" distutils2 로 대체됩니다 . 나는 내가 setuptools와 달걀을 좋아하고 distutils2의 편리함에 아직 완전히 확신하지 못했다고 말해야한다. 그것은 필요합니다

pip install Distutils2

및 설치

python -m distutils2.run install

추신

포장은 결코 사소한 것이 아니었기 때문에 (새로운 것을 개발하려고 시도함으로써 이것을 배운다), 나는 이유 때문에 많은 일들이 사라 졌다고 생각합니다. 난 그냥이 시간 희망 합니다 제대로 수행됩니다.


Python Packaging User Guide 의 예제 프로젝트 setup.py권장합니다 .

Python 패키징 사용자 가이드는 "현재 도구를 사용하여 Python 배포판을 패키징, 게시 및 설치하는 방법에 대한 권위있는 리소스가되는 것을 목표로합니다".


최소한의 예

from setuptools import setup, find_packages


setup(name='foo',
      version='1.0',
      packages=find_packages(),
      )

여기서 distutils 및 setup.py를 사용하는 가장 간단한 예를 찾을 수 있습니다.

https://docs.python.org/2/distutils/introduction.html#distutils-simple-example

이것은 모든 코드가 단일 파일에 있다고 가정하고 단일 모듈을 포함하는 프로젝트를 패키징하는 방법을 알려줍니다.


작은 파이썬 패키지의 완전한 예제 https://github.com/marcindulak/python-mycli보십시오 . https://packaging.python.org/en/latest/distributing.html의 패키징 권장 사항을 기반으로 하고 distutils와 함께 setup.py를 사용하며 RPM 및 deb 패키지를 만드는 방법을 보여줍니다.

프로젝트의 setup.py가 아래에 포함되어 있습니다 (전체 소스는 저장소 참조).

#!/usr/bin/env python

import os
import sys

from distutils.core import setup

name = "mycli"

rootdir = os.path.abspath(os.path.dirname(__file__))

# Restructured text project description read from file
long_description = open(os.path.join(rootdir, 'README.md')).read()

# Python 2.4 or later needed
if sys.version_info < (2, 4, 0, 'final', 0):
    raise SystemExit, 'Python 2.4 or later is required!'

# Build a list of all project modules
packages = []
for dirname, dirnames, filenames in os.walk(name):
        if '__init__.py' in filenames:
            packages.append(dirname.replace('/', '.'))

package_dir = {name: name}

# Data files used e.g. in tests
package_data = {name: [os.path.join(name, 'tests', 'prt.txt')]}

# The current version number - MSI accepts only version X.X.X
exec(open(os.path.join(name, 'version.py')).read())

# Scripts
scripts = []
for dirname, dirnames, filenames in os.walk('scripts'):
    for filename in filenames:
        if not filename.endswith('.bat'):
            scripts.append(os.path.join(dirname, filename))

# Provide bat executables in the tarball (always for Win)
if 'sdist' in sys.argv or os.name in ['ce', 'nt']:
    for s in scripts[:]:
        scripts.append(s + '.bat')

# Data_files (e.g. doc) needs (directory, files-in-this-directory) tuples
data_files = []
for dirname, dirnames, filenames in os.walk('doc'):
        fileslist = []
        for filename in filenames:
            fullname = os.path.join(dirname, filename)
            fileslist.append(fullname)
        data_files.append(('share/' + name + '/' + dirname, fileslist))

setup(name='python-' + name,
      version=version,  # PEP440
      description='mycli - shows some argparse features',
      long_description=long_description,
      url='https://github.com/marcindulak/python-mycli',
      author='Marcin Dulak',
      author_email='X.Y@Z.com',
      license='ASL',
      # https://pypi.python.org/pypi?%3Aaction=list_classifiers
      classifiers=[
          'Development Status :: 1 - Planning',
          'Environment :: Console',
          'License :: OSI Approved :: Apache Software License',
          'Natural Language :: English',
          'Operating System :: OS Independent',
          'Programming Language :: Python :: 2',
          'Programming Language :: Python :: 2.4',
          'Programming Language :: Python :: 2.5',
          'Programming Language :: Python :: 2.6',
          'Programming Language :: Python :: 2.7',
          'Programming Language :: Python :: 3',
          'Programming Language :: Python :: 3.2',
          'Programming Language :: Python :: 3.3',
          'Programming Language :: Python :: 3.4',
      ],
      keywords='argparse distutils cli unittest RPM spec deb',
      packages=packages,
      package_dir=package_dir,
      package_data=package_data,
      scripts=scripts,
      data_files=data_files,
      )

및 Fedora / EPEL 패키징 지침을 어느 정도 따르는 RPM 사양 파일은 다음과 같습니다.

# Failsafe backport of Python2-macros for RHEL <= 6
%{!?python_sitelib: %global python_sitelib      %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")}
%{!?python_sitearch:    %global python_sitearch     %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
%{!?python_version: %global python_version      %(%{__python} -c "import sys; sys.stdout.write(sys.version[:3])")}
%{!?__python2:      %global __python2       %{__python}}
%{!?python2_sitelib:    %global python2_sitelib     %{python_sitelib}}
%{!?python2_sitearch:   %global python2_sitearch    %{python_sitearch}}
%{!?python2_version:    %global python2_version     %{python_version}}

%{!?python2_minor_version: %define python2_minor_version %(%{__python} -c "import sys ; print sys.version[2:3]")}

%global upstream_name mycli


Name:           python-%{upstream_name}
Version:        0.0.1
Release:        1%{?dist}
Summary:        A Python program that demonstrates usage of argparse
%{?el5:Group:       Applications/Scientific}
License:        ASL 2.0

URL:            https://github.com/marcindulak/%{name}
Source0:        https://github.com/marcindulak/%{name}/%{name}-%{version}.tar.gz

%{?el5:BuildRoot:   %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)}
BuildArch:      noarch

%if 0%{?suse_version}
BuildRequires:      python-devel
%else
BuildRequires:      python2-devel
%endif


%description
A Python program that demonstrates usage of argparse.


%prep
%setup -qn %{name}-%{version}


%build
%{__python2} setup.py build


%install
%{?el5:rm -rf $RPM_BUILD_ROOT}
%{__python2} setup.py install --skip-build --prefix=%{_prefix} \
   --optimize=1 --root $RPM_BUILD_ROOT


%check
export PYTHONPATH=`pwd`/build/lib
export PATH=`pwd`/build/scripts-%{python2_version}:${PATH}
%if 0%{python2_minor_version} >= 7
%{__python2} -m unittest discover -s %{upstream_name}/tests -p '*.py'
%endif


%clean
%{?el5:rm -rf $RPM_BUILD_ROOT}


%files
%doc LICENSE README.md
%{_bindir}/*
%{python2_sitelib}/%{upstream_name}
%{?!el5:%{python2_sitelib}/*.egg-info}


%changelog
* Wed Jan 14 2015 Marcin Dulak <X.Y@Z.com> - 0.0.1-1
- initial version

참고 URL : https://stackoverflow.com/questions/4740473/setup-py-examples

반응형