이 페이지를 공부 한 후 :
http://docs.python.org/distutils/builtdist.html
나는 (페도라 rpm 파일을 만드는 것을 목표로) 내 자신을 만들기 위해 공부할 몇 가지 setup.py 파일을 찾고 싶습니다.
커뮤니티가 좋은 예를 보여줄 수 있습니까?
이 페이지를 공부 한 후 :
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에서 제공됩니다.
바퀴의 장점
(와 바퀴에 대한) 정확한 파이썬 포장의 전체 이야기에 덮여 packaging.python.org
과학 컴퓨팅 ( package.python.org 에서도 권장 됨, 위 참조) 의 경우 PyPI 및 pip 도구를 기반으로하는 타사 서비스 빌드로 볼 수있는 CONDA 패키징 을 사용하는 것이 좋습니다 . 또한 자신의 binstar 버전을 설정 하는데도 효과적 이므로 정교한 맞춤형 엔터프라이즈 패키지 관리를위한 트릭을 수행 할 수 있다고 생각합니다.
Conda는 사용자 폴더 (슈퍼 사용자 권한 없음)에 설치할 수 있으며 마법처럼 작동합니다.
콘다 설치
강력한 가상 환경 확장.
이 옵션은 python-distribute.org와 관련이 있으며 사이트뿐만 아니라 훨씬 구식이므로 사용할 준비가 된 컴팩트 한 setup.py 예제 중 하나를 알려 드리겠습니다.
이 인용문은 setup.py 상태에 대한 가이드에서 가져온 것이며 여전히 적용됩니다.
하나 더 추가합니다 (나에게서)
무의미한 복사 붙여 넣기를 시도하기 전에 (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
포장은 결코 사소한 것이 아니었기 때문에 (새로운 것을 개발하려고 시도함으로써 이것을 배운다), 나는 이유 때문에 많은 일들이 사라 졌다고 생각합니다. 난 그냥이 시간 희망 합니다 제대로 수행됩니다.
작은 파이썬 패키지의 완전한 예제 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
이것은 모든 코드가 단일 파일에 있다고 가정하고 단일 모듈을 포함하는 프로젝트를 패키징하는 방법을 알려줍니다.
다음은 유용한 주석과 링크가 있는 간단한 setup.py 파일 (템플릿) 을 생성하기 위해 작성한 유틸리티 입니다. 도움이 되길 바랍니다.
sudo pip install setup-py-cli
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의 내용 :
다음은 저장소에 대한 링크 입니다. 솔루션을 향상시키기 위해 자유롭게 채우십시오.