contoh setup.py?


Jawaban:


62

Panduan lengkap penulisan setup.pyskrip di sini . (dengan beberapa contoh)

Jika Anda menyukai contoh dunia nyata, saya dapat menunjukkan kepada Anda setup.pyskrip dari beberapa proyek besar. Django ada di sini , pyglet ada di sini . Anda bisa menelusuri sumber proyek lain untuk sebuah file bernama setup.py untuk lebih banyak contoh.

Ini bukan contoh sederhana; tautan tutorial yang saya berikan memiliki itu. Ini lebih kompleks, tetapi juga lebih praktis.


30

Anda mungkin menemukan Hitchhiker Guide to Kemasan membantu, meskipun tidak lengkap. Saya akan mulai dengan tutorial Mulai Cepat . Coba juga hanya menelusuri paket Python di Indeks Paket Python . Cukup unduh tarballnya, keluarkan, dan lihat filesetup.py file. Atau bahkan lebih baik, hanya perlu mencari melalui paket yang mencantumkan repositori kode sumber publik seperti yang dihosting di GitHub atau BitBucket. Anda pasti akan menemukan salah satunya di halaman depan.

Saran terakhir saya adalah melakukannya dan mencoba membuatnya; jangan takut gagal. Saya benar-benar tidak memahaminya sampai saya mulai membuatnya sendiri. Sangat mudah membuat paket baru di PyPI dan semudah menghapusnya. Jadi, buat paket dummy dan mainkan.


26

BACA INI TERLEBIH DAHULU https://packaging.python.org/en/latest/current.html

Rekomendasi Alat Instalasi

  1. Gunakan pip untuk menginstal paket Python dari PyPI.
  2. Gunakan virtualenv, atau pyvenv untuk mengisolasi dependensi khusus aplikasi dari instalasi Python bersama.
  3. Gunakan roda pip untuk membuat cache distribusi roda, dengan tujuan> mempercepat instalasi selanjutnya.
  4. Jika Anda mencari pengelolaan tumpukan perangkat lunak lintas platform yang terintegrasi penuh, pertimbangkan pembuatan (terutama difokuskan pada komunitas pengembangan web) atau Hashdist, atau conda (keduanya terutama berfokus pada komunitas ilmiah).

Rekomendasi Alat Pengemasan

  1. Gunakan setuptools untuk menentukan proyek dan membuat Distribusi Sumber.
  2. Gunakan ekstensi setuptools bdist_wheel yang tersedia dari proyek roda untuk membuat roda. Ini sangat bermanfaat, jika proyek Anda berisi ekstensi biner.
  3. Gunakan benang untuk mengunggah distribusi ke PyPI.

Anwser ini sudah berumur, dan memang ada sebuah rencana penyelamatan dunia yang dinamakan python packaging

roda cara

Saya qoute pythonwheels.com di sini:

Apa itu roda?

Roda adalah standar baru distribusi python dan dimaksudkan untuk menggantikan telur. Dukungan ditawarkan dalam pip> = 1.4 dan setuptools> = 0.8.

Keunggulan roda

  1. Instalasi lebih cepat untuk python murni dan paket ekstensi C asli.
  2. Menghindari eksekusi kode arbitrer untuk penginstalan. (Hindari setup.py)
  3. Pemasangan ekstensi C tidak memerlukan kompiler di Windows atau OS X.
  4. Memungkinkan caching yang lebih baik untuk pengujian dan integrasi berkelanjutan.
  5. Membuat file .pyc sebagai bagian dari instalasi untuk memastikan cocok dengan interpreter python yang digunakan.
  6. Pemasangan yang lebih konsisten di seluruh platform dan mesin.

Kisah lengkap tentang pengemasan python yang benar (dan tentang roda) tercakup di packaging.python.org


cara conda

Untuk komputasi ilmiah (ini juga direkomendasikan di packaging.python.org, lihat di atas) Saya akan mempertimbangkan untuk menggunakan kemasan CONDA yang dapat dilihat sebagai layanan pihak ke-3 yang dibangun di atas alat PyPI dan pip. Ini juga berfungsi dengan baik saat menyiapkan versi binstar Anda sendiri jadi saya membayangkan itu dapat melakukan trik untuk manajemen paket perusahaan kustom yang canggih.

Conda dapat diinstal ke dalam folder pengguna (tanpa izin pengguna super) dan berfungsi seperti ajaib

conda install

dan perluasan virtual env yang kuat.


cara telur

Opsi ini terkait dengan python-distribute.org dan sebagian besar sudah usang (serta situsnya) jadi izinkan saya mengarahkan Anda ke salah satu contoh setup.py yang siap digunakan namun ringkas yang saya suka:

  • Contoh / implementasi yang sangat praktis dari pencampuran skrip dan file python tunggal ke setup.py diberikan di sini
  • Bahkan lebih baik dari hyperopt

Kutipan ini diambil dari panduan tentang status setup.py dan masih berlaku:

  • setup.py hilang!
  • distutils hilang!
  • mendistribusikan hilang!
  • pip dan virtualenv di sini untuk tinggal!
  • telur ... hilang!

Saya menambahkan satu poin lagi (dari saya)

  • roda !

Saya akan merekomendasikan untuk mendapatkan pemahaman tentang ekosistem pengemasan (dari panduan yang ditunjukkan oleh gotgenes) sebelum mencoba penempelan salinan yang tidak masuk akal.

Sebagian besar contoh di luar sana di Internet dimulai dengan

from distutils.core import setup

tetapi ini misalnya tidak mendukung pembuatan telur python setup.py bdist_egg (serta beberapa fitur lama lainnya ), yang tersedia di

from setuptools import setup

Dan alasannya adalah mereka tidak digunakan lagi .

Sekarang menurut panduannya

Peringatan

Silakan gunakan paket Distribute daripada paket Setuptools karena ada masalah dalam paket ini yang bisa dan tidak akan bisa diperbaiki.

Setuptools yang tidak digunakan lagi harus diganti dengan distutils2 , yang "akan menjadi bagian dari pustaka standar di Python 3.3". Saya harus mengatakan saya menyukai setuptools dan telur dan belum sepenuhnya diyakinkan oleh kenyamanan distutils2. Itu membutuhkan

pip install Distutils2

dan untuk menginstal

python -m distutils2.run install

PS

Pengemasan tidak pernah sepele (orang mempelajarinya dengan mencoba mengembangkan yang baru), jadi saya berasumsi banyak hal telah hilang karena alasan. Saya hanya berharap kali ini akan dilakukan dengan benar.


4
jadi, bagaimana jawaban ini berumur? apakah distutils2 datang dengan python 3.3? apakah alat-alat setup mati dan layu?
Capi Etheriel

Dapatkah Anda memberikan referensi ke "panduan tentang status setup.py"? Karena ini "setup.py hilang!" salah. Ini 2017 dan setup.py si masih di sini.
karantan

12

Contoh minimal

from setuptools import setup, find_packages


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

Info selengkapnya di dokumen


5

Lihat contoh lengkap ini https://github.com/marcindulak/python-mycli dari paket python kecil. Ini didasarkan pada rekomendasi pengemasan dari https://packaging.python.org/en/latest/distributing.html , menggunakan setup.py dengan distutils dan juga menunjukkan cara membuat paket RPM dan deb.

Setup.py proyek disertakan di bawah ini (lihat repo untuk sumber lengkap):

#!/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,
      )

dan dan file spesifikasi RPM yang kurang lebih mengikuti pedoman pengemasan Fedora / EPEL mungkin terlihat seperti:

# 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
tolong, alih-alih hanya menyalin / menempel tautan, coba ekstrak bagian penting yang sebenarnya menjawab pertanyaan
fredmaggiowski



3

Berikut adalah utilitas yang saya tulis untuk menghasilkan setup.py sederhana file (template) dengan komentar dan link yang berguna. Semoga bermanfaat.

Instalasi

sudo pip install setup-py-cli

Pemakaian

Untuk menghasilkan file setup.py cukup ketik di terminal.

setup-py

Sekarang file setup.py akan muncul di direktori saat ini.

Membuat 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=[]  
)

Isi dari setup.py yang dihasilkan :

  • nama paket secara otomatis memenuhi berdasarkan nama direktori saat ini.
  • beberapa bidang dasar yang harus dipenuhi.
  • mengklarifikasi komentar dan tautan ke sumber daya yang berguna.
  • secara otomatis memasukkan deskripsi dari README.md atau string kosong jika tidak ada README.md .

Ini tautan ke repositori. Isi gratis untuk menyempurnakan solusi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.