이 페이지를 공부 한 후 :
http://docs.python.org/distutils/builtdist.html
나는 (페도라 rpm 파일을 만드는 것을 목표로) 내 자신을 만들기 위해 공부할 몇 가지 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
설치 도구 권장 사항
- pip를 사용하여 PyPI에서 Python 패키지를 설치합니다.
- virtualenv 또는 pyvenv를 사용하여 공유 Python 설치에서 애플리케이션 특정 종속성을 분리합니다.
- 후속 설치 속도를 높이기 위해 pip wheel을 사용하여 휠 배포 캐시를 만듭니다.
- 완전히 통합 된 크로스 플랫폼 소프트웨어 스택의 관리를 찾고 있다면 빌드 아웃 (주로 웹 개발 커뮤니티에 집중) 또는 Hashdist 또는 conda (둘 다 주로 과학 커뮤니티에 집중)를 고려하십시오.
패키징 도구 권장 사항
- setuptools를 사용하여 프로젝트를 정의하고 소스 배포를 만듭니다.
- wheel 프로젝트에서 사용 가능한 bdist_wheel setuptools 확장을 사용하여 바퀴를 만듭니다. 프로젝트에 바이너리 확장이 포함되어있는 경우 특히 유용합니다.
- PyPI에 배포 물을 업로드하려면 twine을 사용하십시오.
이 anwser는 오래되었고 실제로 파이썬 패키징 세계에 대한 구조 계획이 있습니다.
바퀴 방법
나는 여기에 pythonwheels.com을 qoute :
바퀴는 무엇입니까?
바퀴는 파이썬 배포의 새로운 표준이며 계란을 대체하기위한 것입니다. 지원은 pip> = 1.4 및 setuptools> = 0.8에서 제공됩니다.
바퀴의 장점
- 순수 Python 및 네이티브 C 확장 패키지를위한 더 빠른 설치.
- 설치를위한 임의 코드 실행을 방지합니다. (setup.py 회피)
- C 확장을 설치하려면 Windows 또는 OS X에 컴파일러가 필요하지 않습니다.
- 테스트 및 지속적인 통합을 위해 더 나은 캐싱을 허용합니다.
- 사용 된 python 인터프리터와 일치하도록 설치의 일부로 .pyc 파일을 만듭니다.
- 플랫폼과 시스템에보다 일관된 설치.
(와 바퀴에 대한) 정확한 파이썬 포장의 전체 이야기에 덮여 packaging.python.org
콘다 방법
과학 컴퓨팅 ( package.python.org 에서도 권장 됨, 위 참조) 의 경우 PyPI 및 pip 도구를 기반으로하는 타사 서비스 빌드로 볼 수있는 CONDA 패키징 을 사용하는 것이 좋습니다 . 또한 자신의 binstar 버전을 설정 하는데도 효과적 이므로 정교한 맞춤형 엔터프라이즈 패키지 관리를위한 트릭을 수행 할 수 있다고 생각합니다.
Conda는 사용자 폴더 (슈퍼 사용자 권한 없음)에 설치할 수 있으며 마법처럼 작동합니다.
콘다 설치
강력한 가상 환경 확장.
계란 방법
이 옵션은 python-distribute.org와 관련이 있으며 사이트뿐만 아니라 훨씬 구식이므로 사용할 준비가 된 컴팩트 한 setup.py 예제 중 하나를 알려 드리겠습니다.
이 인용문은 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
이것은 모든 코드가 단일 파일에 있다고 가정하고 단일 모듈을 포함하는 프로젝트를 패키징하는 방법을 알려줍니다.