setup.py ví dụ?


88

Sau khi nghiên cứu trang này:

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

Tôi hy vọng sẽ tìm thấy một số tệp setup.py để nghiên cứu và tạo ra tệp của riêng tôi (với mục tiêu tạo tệp vòng / phút fedora).

Cộng đồng có thể chỉ cho tôi một số ví dụ điển hình không?

Câu trả lời:


61

Hướng dẫn đầy đủ về cách viết setup.pyscript tại đây . (với một số ví dụ)

Nếu bạn muốn một ví dụ trong thế giới thực, tôi có thể hướng dẫn bạn về setup.pykịch bản của một vài dự án lớn. Django's ở đây , pyglet's ở đây . Bạn chỉ có thể duyệt qua nguồn của các dự án khác cho một tệp có tên setup.py để biết thêm ví dụ.

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


30

Bạn có thể thấy Hướng dẫn đóng gói của HitchHiker hữu ích, ngay cả khi nó chưa đầy đủ. Tôi sẽ bắt đầu với hướng dẫn Bắt đầu nhanh . Cũng hãy thử duyệt qua các gói Python trên Chỉ mục gói Python . Chỉ cần tải xuống tarball, giải nén nó và xemsetup.py tệp. Hoặc thậm chí tốt hơn, chỉ cần quan tâm đến các gói liệt kê một kho mã nguồn công khai, chẳng hạn như một kho lưu trữ trên GitHub hoặc BitBucket. Bạn chắc chắn sẽ gặp một cái trên trang nhất.

Đề xuất cuối cùng của tôi là chỉ cần đi cho nó và thử làm một cái; đừ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ự làm chúng. Thật đơn giản khi tạo một gói mới trên PyPI và dễ dàng gỡ bỏ nó. Vì vậy, hãy tạo một gói giả và chơi xung quanh.


26

ĐỌC ĐẦU NÀY https://packaging.python.org/en/latest/current.html

Đề xuất về Công cụ Cài đặt

  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 phần phụ thuộc cụ thể của ứng dụng khỏi cài đặt Python được chia sẻ.
  3. Sử dụng bánh xe pip để tạo bộ nhớ cache của các bản phân phối bánh xe, với mục đích> tăng tốc độ cài đặt tiếp theo.
  4. Nếu bạn đang tìm cách quản lý các ngăn xếp phần mềm đa nền tảng được 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 chủ yếu tập trung vào cộng đồng khoa học).

Khuyến nghị về Công cụ Đóng gói

  1. Sử dụng công cụ thiết lập để xác định dự án và tạo Phân phối nguồn.
  2. Sử dụng phần mở rộng bdist_wheel setuptools 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 các phần mở rộng nhị phân.
  3. Sử dụng twine để tải các bản phân phối lên PyPI.

Nhà cảm xạ này đã già đi, và thực sự có một kế hoạch giải cứu thế giới đóng gói trăn có tên

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 của việc phân phối trăn và nhằm thay thế trứng. Hỗ trợ được cung cấp bằng pip> = 1,4 và setuptools> = 0,8.

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

  1. Cài đặt nhanh hơn cho các gói mở rộng python và C gốc thuần túy.
  2. Tránh thực thi mã tùy ý để cài đặt. (Tránh setup.py)
  3. Cài đặt phần 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 để thử nghiệm và tích hợp liên tục.
  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 python được sử dụng.
  6. Cài đặt nhất quán hơn trên các nền tảng và máy móc.

Toàn bộ câu chuyện về cách đóng gói mỡ trăn chính xác (và về bánh xe) được đề cập tại packaging.python.org


chung cư cách

Đối với máy tính khoa học (điều này cũng được khuyến nghị trên pack.python.org , xem ở trên), tôi sẽ cân nhắc sử dụng bao bì CONDA , có thể được xem như một bản dựng dịch vụ của bên thứ ba dựa trên PyPI và các công cụ pip. Nó cũng hoạt động tuyệt vời 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 phức tạp.

Conda có thể được cài đặt vào một thư mục người dùng (không có sự cho phép của người dùng cấp cao) và hoạt động như một phép thuật với

cài đặt chung cư

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


trứng cách

Tùy chọn này có liên quan đến python-distribute.org và lớn hơn đã 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 ví dụ setup.py đã sẵn sàng để sử dụng nhưng nhỏ gọn mà tôi thích:

  • Một ví dụ / triển khai rất thực tế của việc trộn các tập lệnh và các tệp python đơn vào setup.py được đưa ra ở đây
  • Thậm chí còn tốt hơn từ hyperopt

Trích dẫn này được lấy từ hướng dẫn trên trạng thái setup.py và vẫn áp dụng:

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

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

  • bánh xe !

Tôi khuyên bạn nên tìm hiểu một số hiểu biết về hệ sinh thái đóng gói (từ hướng dẫn do gotgenes chỉ ra) trước khi cố gắng sao chép vô tâm.

Hầu hết các ví dụ trên Internet đều bắt đầu bằng

from distutils.core import setup

nhưng ví dụ này không hỗ trợ tạo 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 bị phản đối .

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

Cảnh báo

Vui lòng sử dụng gói Phân phối thay vì gói Setuptools vì có những vấn đề trong gói này có thể và sẽ không được khắc phục.

các setuptools không dùng nữa 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à vẫn chưa hoàn toàn bị thuyết phục bởi sự tiện lợi của distutils2. Nó yêu cầu

pip install Distutils2

và cài đặt

python -m distutils2.run install

PS

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


4
vậy, câu trả lời này đã già đi như thế nào? distutils2 có đi kèm với python 3.3 không? setuptools đã chết và khô héo?
Capi Etheriel

Bạn có thể cung cấp tài liệu tham khảo cho "hướng dẫn về trạng thái setup.py" không? Bởi vì "setup.py này đã biến mất!" là sai. Đó là năm 2017 và setup.py si vẫn ở đây.
karantan

11

Ví dụ tối thiểu

from setuptools import setup, find_packages


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

Thông tin thêm trong tài liệu


5

Hãy xem ví dụ hoàn chỉnh này https://github.com/marcindulak/python-mycli về một gói python nhỏ. Nó dựa trên các đề xuất đóng gói từ https://packaging.python.org/vi/latest/distributing.html , sử dụng setup.py với các bản phân phối và ngoài ra còn cho biết cách tạo các gói RPM và deb.

Setup.py của dự án được bao gồm bên dưới (xem repo để biết 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='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,
      )

và và tệp thông số kỹ thuật RPM ít nhiều tuân theo nguyên tắc đóng gói Fedora / EPEL có thể trông giống như sau:

# 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
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 các phần quan trọng mà thực sự trả lời câu hỏi
fredmaggiowski

5

Tôi khuyên bạn nên setup.py của Hướng dẫn Python Bao bì tài khoản của ví dụ dự án.

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



2

Đây là tiện ích tôi đã viết để tạo một tệp setup.py (mẫu) đơn giản với các nhận xét và liên kết hữu ích. Tôi hy vọng, nó sẽ hữu ích.

Cài đặt

sudo pip install setup-py-cli

Sử dụng

Để tạo tệp setup.py chỉ cần nhập vào terminal.

setup-py

Bây giờ tệp setup.py sẽ xuất hiện trong thư mục hiện tại.

Đã tạo 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=[]  
)

Nội dung của setup.py được tạo :

  • tên gói tự động hoàn thành dựa trên tên của thư mục hiện tại.
  • một số trường cơ bản cần thực hiện.
  • làm rõ các nhận xét và liên kết đến các nguồn hữu ích.
  • mô tả được chèn tự động từ README.md hoặc một chuỗi trống nếu không có README.md .

Đây là liên kết đến kho lưu trữ. Điền miễn phí để nâng cao giải pháp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.