2011-01-19 22 views
55

Sau khi nghiên cứu trang này:setup.py?

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

Tôi hy vọng sẽ tìm thấy một số file setup.py để nghiên cứu để làm của riêng của tôi (với mục tiêu làm cho một file rpm fedora).

Có thể là s.o. cộng đồng chỉ cho tôi một số ví dụ tốt?

Trả lời

44

Hoàn thành hướng dẫn bằng văn bản setup.py tập lệnh here. (với một số ví dụ)

Nếu bạn muốn một ví dụ thực tế, tôi có thể chỉ cho bạn hướng tới các tập lệnh setup.py của một vài dự án lớn. Django là here, pyglet's là here. Bạn chỉ có thể duyệt nguồn của các dự án khác cho một tệp có tên là setup.py để biết thêm các ví dụ.

Đây không phải là ví dụ đơn giản; liên kết hướng dẫn mà tôi đưa ra có liên kết. Đây là những phức tạp hơn, nhưng cũng thực tế hơn.

27

Bạn có thể tìm thấy HitchHiker's Guide to Packaging hữu ích, mặc dù nó chưa hoàn tất. Tôi bắt đầu với số Quick Start tutorial. Hãy thử cũng chỉ duyệt qua các gói Python trên Python Package Index. Chỉ cần tải xuống tarball, giải nén và xem tập tin setup.py. Hoặc thậm chí tốt hơn, chỉ bận tâm xem xét các gói liệt kê một kho lưu trữ mã nguồn công cộng như một kho lưu trữ trên GitHub hoặc BitBucket. Bạn đang bị ràng buộc để chạy vào một trên trang nhất.

Đề nghị cuối cùng của tôi là chỉ cần đi cho nó và thử làm một; đừng sợ thất bại. Tôi thực sự không hiểu nó cho đến khi tôi bắt đầu tự mình làm. Nó là tầm thường để tạo ra một gói mới trên PyPI và dễ dàng loại bỏ nó. Vì vậy, hãy tạo một gói giả và chơi xung quanh.

22

READ FIRSThttps://packaging.python.org/en/latest/current.html

Lắp đặt NÀY Tool Khuyến nghị

  1. Sử dụng pip để cài đặt các gói Python từ PyPI.
  2. Sử dụng virtualenv hoặc pyvenv để tách biệt các ứng dụng phụ thuộc cụ thể khỏi cài đặt Python được chia sẻ.
  3. Sử dụng bánh xe pip để tạo bộ nhớ cache phân phối bánh xe, với mục đích tăng tốc các cài đặt tiếp theo.
  4. Nếu bạn đang tìm kiếm quản lý ngăn xếp phần mềm đa nền tảng tích hợp đầy đủ, hãy cân nhắc xây dựng (chủ yếu tập trung vào cộng đồng phát triển web) hoặc Hashdist hoặc conda (cả hai đều tập trung chủ yếu vào cộng đồng khoa học).

Tool Bao bì Khuyến nghị

  1. Sử dụng setuptools để xác định các dự án và tạo nguồn phân phối.
  2. Sử dụng tiện ích mở rộng thiết lập bdist_wheel có sẵn từ dự án bánh xe để tạo bánh xe. Điều này đặc biệt có lợi, nếu dự án của bạn chứa phần mở rộng nhị phân.
  3. Sử dụng dây bện để tải bản phân phối lên PyPI.

anwser này đã già, và thực sự có một kế hoạch giải cứu để đóng gói python thế giới gọi là

bánh xe cách

tôi qoute pythonwheels.com đây:

Bánh xe là gì?

Bánh xe là tiêu chuẩn mới về phân phối python và được dự định thay thế trứng. Hỗ trợ được cung cấp trong pip> = 1.4 và các công cụ thiết lập> = 0,8.

Ưu điểm của bánh xe

  1. nhanh hơn cài đặt cho trăn tinh khiết và các gói mở rộng C có nguồn gốc.
  2. Tránh thực thi mã tùy ý để cài đặt. (Tránh thiết lập.py)
  3. Cài đặt tiện ích mở rộng C không yêu cầu trình biên dịch trên Windows hoặc OS X.
  4. Cho phép bộ nhớ đệm tốt hơn để kiểm tra và liên tục tích hợp.
  5. Tạo tệp .pyc như một phần của quá trình cài đặt để đảm bảo chúng khớp với trình thông dịch trăn được sử dụng.
  6. Cài đặt nhất quán hơn trên nền tảng và máy.

Câu chuyện đầy đủ bao bì python đúng (và về bánh xe) được bao phủ tại packaging.python.org


conda cách

Đối với khoa học máy tính (điều này cũng được đề nghị trên packaging.python.org, xem ở trên) Tôi sẽ xem xét sử dụng CONDA packaging có thể được xem như là một dịch vụ bên thứ 3 xây dựng trên đầu trang của PyPI và pip công cụ. Nó cũng hoạt động tốt khi thiết lập phiên bản binstar của riêng bạn vì vậy tôi sẽ tưởng tượng nó có thể thực hiện thủ thuật để quản lý gói doanh nghiệp tùy chỉnh tinh vi.

Conda thể được cài đặt vào một thư mục người sử dụng (không permisssions super user) và hoạt động giống như ma thuật với

conda cài đặt

và mạnh mẽ mở rộng env ảo.


trứng cách

Tùy chọn này có liên quan đến python-distribute.org và là largerly lỗi thời (cũng như trang web) vì vậy hãy để tôi chỉ cho bạn một trong những đã sẵn sàng để sử dụng thiết lập và nhỏ gọn .ví dụ py tôi thích:

  • Một ví dụ rất thực tế/thực hiện các script trộn và các file python duy nhất vào setup.py là cho here
  • Thậm chí tốt hơn một từ hyperopt

quote này được chụp từ hướng dẫn về trạng thái của setup.py và vẫn áp dụng:

  • setup.py đã biến mất!
  • phần mềm biến mất!
  • phân phối đã biến mất!
  • pip và virtualenv tại đây để ở!
  • trứng ... đã biến mất!

tôi thêm một điểm nữa (từ tôi)

  • bánh!

Tôi khuyên bạn nên hiểu rõ về packaging-ecosystem (từ hướng dẫn được chỉ bởi gotgenes) trước khi cố gắng sao chép không cần chú ý.

Hầu hết các ví dụ trên mạng trong Internet bắt đầu với

from distutils.core import setup 

nhưng điều này ví dụ như không hỗ trợ xây dựng một quả trứng python setup.py bdist_egg (cũng như một số tính năng khác), đã có sẵn trong

from setuptools import setup 

Và lý do là chúng được không được dùng.

Bây giờ theo hướng dẫn

Warning

Vui lòng sử dụng gói phân phối chứ không phải là setuptools gói vì có những vấn đề trong gói này có thể và sẽ không được cố định.

các thiết lập không được chấp nhận sẽ được thay thế bằng distutils2, "sẽ là một phần của thư viện chuẩn trong Python 3.3". Tôi phải nói rằng tôi thích setuptools và trứng và chưa được hoàn toàn thuyết phục bởi sự tiện lợi của distutils2.Nó đòi hỏi

pip install Distutils2 

và cài đặt

python -m distutils2.run install 

PS

Bao bì không bao giờ là tầm thường (một học này bằng cách cố gắng phát triển một hình mới), vì vậy tôi giả định một nhiều thứ đã đi vì lý do. Tôi chỉ hy vọng lần này là sẽ là được thực hiện đúng.

+4

vì vậy, câu trả lời này có độ tuổi như thế nào? đã distutils2 đi kèm với python 3.3? đã setuptools chết và khô héo? –

+1

được cập nhật với bánh xe và tùy chọn conda –

+0

Hình như nhóm PyPA đã làm một công việc tuyệt vời afterall https://www.pypa.io –

2

Tôi khuyên bạn nên setup.py trong dự án ví dụ của Python Packaging User Guide.

Hướng dẫn sử dụng bao bì Python "nhằm mục đích là tài nguyên có thẩm quyền về cách đóng gói, xuất bản và cài đặt bản phân phối Python bằng các công cụ hiện tại".

2

Hãy xem ví dụ hoàn chỉnh này https://github.com/marcindulak/python-mycli của gói python nhỏ. Nó dựa trên các khuyến nghị đóng gói từ https://packaging.python.org/en/latest/distributing.html, sử dụng setup.py với các dấu rãnh và ngoài ra còn cho thấy cách tạo RPM và các gói deb.

setup.py của dự án được bao gồm bên dưới (xem repo cho nguồn đầy đủ):

#!/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='[email protected]', 
     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, 
    ) 

và và RPM đặc tả tập tin mà nhiều hay ít sau chủ trương đóng gói Fedora/EPEL có thể trông giống như:

# 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 <[email protected]> - 0.0.1-1 
- initial version 
+2

xin vui lòng, thay vì chỉ cần sao chép/dán liên kết cố gắng trích xuất phần quan trọng thực sự trả lời câu hỏi – FredMaggiowski

Các vấn đề liên quan