BACA INI TERLEBIH DAHULU https://packaging.python.org/en/latest/current.html
Rekomendasi Alat Instalasi
- Gunakan pip untuk menginstal paket Python dari PyPI.
- Gunakan virtualenv, atau pyvenv untuk mengisolasi dependensi khusus aplikasi dari instalasi Python bersama.
- Gunakan roda pip untuk membuat cache distribusi roda, dengan tujuan> mempercepat instalasi selanjutnya.
- 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
- Gunakan setuptools untuk menentukan proyek dan membuat Distribusi Sumber.
- Gunakan ekstensi setuptools bdist_wheel yang tersedia dari proyek roda untuk membuat roda. Ini sangat bermanfaat, jika proyek Anda berisi ekstensi biner.
- 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
- Instalasi lebih cepat untuk python murni dan paket ekstensi C asli.
- Menghindari eksekusi kode arbitrer untuk penginstalan. (Hindari setup.py)
- Pemasangan ekstensi C tidak memerlukan kompiler di Windows atau OS X.
- Memungkinkan caching yang lebih baik untuk pengujian dan integrasi berkelanjutan.
- Membuat file .pyc sebagai bagian dari instalasi untuk memastikan cocok dengan interpreter python yang digunakan.
- 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)
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.
Contoh minimal
from setuptools import setup, find_packages setup( name="foo", version="1.0", packages=find_packages(), )
Info selengkapnya di dokumen
sumber
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='[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, )
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 <[email protected]> - 0.0.1-1 - initial version
sumber
Saya merekomendasikan setup.py dari proyek contoh Panduan Pengguna Pengemasan Python .
Panduan Pengguna Pengemasan Python "bertujuan untuk menjadi sumber otoritatif tentang cara mengemas, menerbitkan, dan menginstal distribusi Python menggunakan alat saat ini".
sumber
Di sini Anda akan menemukan contoh yang paling sederhana dari penggunaan distutils dan setup.py:
https://docs.python.org/2/distutils/introduction.html#distutils-simple-example
Ini mengasumsikan bahwa semua kode Anda ada dalam satu file dan memberi tahu cara mengemas proyek yang berisi satu modul.
sumber
Berikut adalah utilitas yang saya tulis untuk menghasilkan setup.py sederhana file (template) dengan komentar dan link yang berguna. Semoga bermanfaat.
Instalasi
Pemakaian
Untuk menghasilkan file setup.py cukup ketik di terminal.
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 :
Ini tautan ke repositori. Isi gratis untuk menyempurnakan solusi.
sumber