[python] 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

추신

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


답변

최소한의 예

from setuptools import setup, find_packages


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

문서의 추가 정보


답변

작은 파이썬 패키지의 완전한 예제 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


답변

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

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


답변

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

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

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