LESEN SIE DIESES ERSTE https://packaging.python.org/en/latest/current.html
Empfehlungen für das Installationstool
- Verwenden Sie pip, um Python-Pakete von PyPI zu installieren.
- Verwenden Sie virtualenv oder pyvenv, um anwendungsspezifische Abhängigkeiten von einer gemeinsam genutzten Python-Installation zu isolieren.
- Verwenden Sie Pip Wheel, um einen Cache mit Radverteilungen zu erstellen, um> nachfolgende Installationen zu beschleunigen.
- Wenn Sie nach der Verwaltung vollständig integrierter plattformübergreifender Software-Stacks suchen, sollten Sie Buildout (hauptsächlich für die Webentwicklungs-Community) oder Hashdist oder Conda (beide hauptsächlich für die wissenschaftliche Community) in Betracht ziehen.
Empfehlungen für das Verpackungstool
- Verwenden Sie setuptools, um Projekte zu definieren und Quellverteilungen zu erstellen.
- Verwenden Sie die im Radprojekt verfügbare Erweiterung bdist_wheel setuptools, um Räder zu erstellen. Dies ist besonders nützlich, wenn Ihr Projekt binäre Erweiterungen enthält.
- Verwenden Sie Schnur zum Hochladen von Distributionen auf PyPI.
Diese Antwort ist gealtert, und tatsächlich gibt es einen Rettungsplan für die Python-Verpackungswelt
Räder Weg
Ich qoute pythonwheels.com hier:
Was sind Räder?
Räder sind der neue Standard der Pythonverteilung und sollen Eier ersetzen. Unterstützung wird in pip> = 1.4 und setuptools> = 0.8 angeboten.
Vorteile von Rädern
- Schnellere Installation für reine Python- und native C-Erweiterungspakete.
- Vermeidet die Ausführung von willkürlichem Code für die Installation. (Vermeidet setup.py)
- Für die Installation einer C-Erweiterung ist kein Compiler unter Windows oder OS X erforderlich.
- Ermöglicht ein besseres Caching zum Testen und zur kontinuierlichen Integration.
- Erstellt im Rahmen der Installation .pyc-Dateien, um sicherzustellen, dass sie mit dem verwendeten Python-Interpreter übereinstimmen.
- Konsistentere Installationen über Plattformen und Maschinen hinweg.
Die vollständige Geschichte der korrekten Python-Verpackung (und der Räder) finden Sie unter package.python.org
Conda Weg
Für das wissenschaftliche Rechnen (dies wird auch auf package.python.org empfohlen, siehe oben) würde ich die Verwendung von CONDA-Paketen in Betracht ziehen, die als Dienst eines Drittanbieters angesehen werden können, der auf PyPI- und Pip-Tools aufbaut. Es funktioniert auch hervorragend beim Einrichten einer eigenen Version von binstar, sodass ich mir vorstellen kann, dass dies den Trick für eine ausgefeilte benutzerdefinierte Verwaltung von Unternehmenspaketen darstellt.
Conda kann in einem Benutzerordner installiert werden (keine Superuser-Berechtigungen) und funktioniert wie mit Magie
conda installieren
und leistungsstarke virtuelle Env-Erweiterung.
Eier Weg
Diese Option stand im Zusammenhang mit python-distribute.org und ist (sowie die Website) weitgehend veraltet. Lassen Sie mich Sie auf eines der gebrauchsfertigen und dennoch kompakten Beispiele für setup.py verweisen, die mir gefallen:
- Ein sehr praktisches Beispiel / eine Implementierung zum Mischen von Skripten und einzelnen Python-Dateien in setup.py finden Sie hier
- Noch besser von Hyperopt
Dieses Zitat stammt aus dem Handbuch zum Status von setup.py und gilt weiterhin:
- setup.py weg!
- distutils weg!
- verteilen weg!
- pip und virtualenv hier bleiben!
- Eier ... weg!
Ich füge noch einen Punkt hinzu (von mir)
Ich würde empfehlen, sich mit dem Verpackungs-Ökosystem vertraut zu machen (aus dem Leitfaden von gotgenes), bevor Sie versuchen, sinnlos zu kopieren.
Die meisten Beispiele im Internet beginnen mit
from distutils.core import setup
Dies unterstützt jedoch beispielsweise nicht das Erstellen einer Ei- Python-Datei setup.py bdist_egg (sowie einiger anderer alter Funktionen), die in verfügbar waren
from setuptools import setup
Und der Grund ist, dass sie veraltet sind .
Nun laut Anleitung
Warnung
Bitte verwenden Sie das Distribute-Paket anstelle des Setuptools-Pakets, da dieses Paket Probleme aufweist, die behoben werden können und nicht.
veraltete setuptools sollen durch distutils2 ersetzt werden , die "Teil der Standardbibliothek in Python 3.3 sein werden". Ich muss sagen, ich mochte Setuptools und Eier und war noch nicht vollständig von der Bequemlichkeit von distutils2 überzeugt. Es benötigt
pip install Distutils2
und zu installieren
python -m distutils2.run install
PS
Das Verpacken war nie trivial (man lernt dies, indem man versucht, ein neues zu entwickeln), daher gehe ich davon aus, dass viele Dinge aus gutem Grund verschwunden sind. Ich hoffe nur , es diesmal wird richtig gemacht wird .
Minimales Beispiel
from setuptools import setup, find_packages setup( name="foo", version="1.0", packages=find_packages(), )
Weitere Infos in den Dokumenten
quelle
Schauen Sie sich dieses vollständige Beispiel https://github.com/marcindulak/python-mycli eines kleinen Python-Pakets an. Es basiert auf Verpackungsempfehlungen von https://packaging.python.org/en/latest/distributing.html , verwendet setup.py mit distutils und zeigt außerdem, wie RPM- und Deb-Pakete erstellt werden.
Die setup.py des Projekts ist unten enthalten (die vollständige Quelle finden Sie im Repo):
#!/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, )
und und RPM-Spezifikationsdatei, die mehr oder weniger den Fedora / EPEL-Verpackungsrichtlinien entspricht, können folgendermaßen aussehen:
# 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
quelle
Ich empfehle die Datei setup.py des Beispielprojekts des Python Packaging-Benutzerhandbuchs .
Das Python Packaging-Benutzerhandbuch soll "die maßgebliche Ressource zum Packen, Veröffentlichen und Installieren von Python-Distributionen mit aktuellen Tools sein".
quelle
Hier finden Sie das einfachste Beispiel für die Verwendung von distutils und setup.py:
https://docs.python.org/2/distutils/introduction.html#distutils-simple-example
Dies setzt voraus, dass sich Ihr gesamter Code in einer einzigen Datei befindet und wie ein Projekt gepackt wird, das ein einzelnes Modul enthält.
quelle
Hier ist das Dienstprogramm, das ich geschrieben habe, um eine einfache setup.py- Datei (Vorlage) mit nützlichen Kommentaren und Links zu generieren . Ich hoffe, es wird nützlich sein.
Installation
Verwendung
Um die Datei setup.py zu generieren, geben Sie einfach das Terminal ein.
Jetzt sollte die Datei setup.py im aktuellen Verzeichnis erscheinen.
Generierte 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=[] )
Inhalt der generierten setup.py :
Hier ist der Link zum Repository. Füllen Sie frei, um die Lösung zu verbessern.
quelle