setup.py 예?


88

이 페이지를 공부 한 후 :

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

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

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

답변:


60

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

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

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


30

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

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


26

먼저 읽어보십시오 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

추신

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


4
그래서,이 대답은 어떻게 낡았습니까? distutils2는 파이썬 3.3과 함께 왔습니까? setuptools가 죽고 시들었습니까?
Capi Etheriel 2014

"setup.py 상태에 대한 가이드"를 참조 할 수 있습니까? 이 "setup.py가 사라졌습니다!" 잘못되었습니다. 2017 년이고 setup.py는 아직 여기에 있습니다.
karantan

11

최소한의 예

from setuptools import setup, find_packages


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

문서의 추가 정보


5

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

2
단순히 복사 대신에 / 붙여 넣기 링크는 실제로 질문에 응답 중요한 부분을 추출하는 시도하십시오
fredmaggiowski

5

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

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



2

다음은 유용한 주석과 링크가 있는 간단한 setup.py 파일 (템플릿) 을 생성하기 위해 작성한 유틸리티 입니다. 도움이 되길 바랍니다.

설치

sudo pip install setup-py-cli

용법

setup.py 파일 을 생성하려면 터미널에 입력하십시오.

setup-py

이제 setup.py 파일이 현재 디렉토리에 있어야합니다.

생성 된 setup.py

from distutils.core import setup
from setuptools import find_packages
import os


# User-friendly description from README.md
current_directory = os.path.dirname(os.path.abspath(__file__))
try:
    with open(os.path.join(current_directory, 'README.md'), encoding='utf-8') as f:
        long_description = f.read()
except Exception:
    long_description = ''

setup(
    # Name of the package
    name=<name of current directory>,

    # Packages to include into the distribution
    packages=find_packages('.'), 

    # Start with a small number and increase it with every change you make
    # https://semver.org
    version='1.0.0',

    # Chose a license from here: https://help.github.com/articles/licensing-a-repository
    # For example: MIT
    license='',

    # Short description of your library
    description='',

    # Long description of your library
    long_description = long_description,
    long_description_context_type = 'text/markdown',

    # Your name
    author='', 

    # Your email
    author_email='',     

    # Either the link to your github or to your website
    url='',

    # Link from which the project can be downloaded
    download_url='',

    # List of keyword arguments
    keywords=[],

    # List of packages to install with this one
    install_requires=[],

    # https://pypi.org/classifiers/
    classifiers=[]  
)

생성 된 setup.py의 내용 :

  • 현재 디렉토리의 이름을 기반으로 자동으로 이행 된 패키지 이름.
  • 수행 할 몇 가지 기본 필드.
  • 유용한 리소스에 대한 설명과 링크를 명확히합니다.
  • README.md 에서 자동으로 삽입 된 설명 또는 README.md 가없는 경우 빈 문자열 .

다음은 저장소에 대한 링크 입니다. 솔루션을 향상시키기 위해 자유롭게 채우십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.