PRZECZYTAJ NAJPIERW https://packaging.python.org/en/latest/current.html
Zalecenia dotyczące narzędzi instalacyjnych
- Użyj pip, aby zainstalować pakiety Pythona z PyPI.
- Użyj virtualenv lub pyvenv, aby odizolować zależności aplikacji od współdzielonej instalacji języka Python.
- Użyj koła pip, aby utworzyć pamięć podręczną rozkładów kół w celu> przyspieszenia kolejnych instalacji.
- Jeśli szukasz zarządzania w pełni zintegrowanymi wieloplatformowymi stosami oprogramowania, rozważ buildout (głównie skupiony na społeczności programistów internetowych) lub Hashdist lub conda (oba koncentrują się głównie na społeczności naukowej).
Zalecenia dotyczące narzędzi do pakowania
- Użyj setuptools do definiowania projektów i tworzenia dystrybucji źródłowych.
- Użyj rozszerzenia setuptools bdist_wheel dostępnego w projekcie koła, aby utworzyć koła. Jest to szczególnie korzystne, jeśli Twój projekt zawiera rozszerzenia binarne.
- Użyj sznurka do przesyłania dystrybucji do PyPI.
Ta odpowiedź się zestarzała i rzeczywiście istnieje plan ratunkowy dla świata pakowania Pythona o nazwie
koła sposób
I qoute pythonwheels.com tutaj:
Co to są koła?
Kółka są nowym standardem dystrybucji Pythona i mają zastąpić jajka. Wsparcie jest oferowane w pip> = 1.4 i setuptools> = 0.8.
Zalety kół
- Szybsza instalacja dla czystych pakietów rozszerzeń języka Python i natywnych C.
- Pozwala uniknąć wykonania dowolnego kodu podczas instalacji. (Unika setup.py)
- Instalacja rozszerzenia C nie wymaga kompilatora w systemie Windows lub OS X.
- Umożliwia lepsze buforowanie na potrzeby testowania i ciągłej integracji.
- Tworzy pliki .pyc jako część instalacji, aby upewnić się, że są one zgodne z używanym interpreterem języka Python.
- Bardziej spójne instalacje na różnych platformach i maszynach.
Pełną historię poprawnego pakowania Pythona (i kół) można znaleźć na stronie Packaging.python.org
Conda Way
W przypadku obliczeń naukowych (jest to również zalecane na stronie Packaging.python.org , patrz wyżej) rozważyłbym użycie pakietu CONDA, które można postrzegać jako usługę innej firmy opartą na narzędziach PyPI i pip. Świetnie sprawdza się również przy tworzeniu własnej wersji binstar więc wyobrażam sobie, że może to zrobić dla wyrafinowanego zarządzania niestandardowymi pakietami dla przedsiębiorstw.
Conda można zainstalować w folderze użytkownika (bez uprawnień superużytkownika) i działa jak magia z
conda install
i potężne wirtualne rozszerzenie środowiska.
sposób na jajka
Ta opcja była związana z python-distribute.org i jest znacznie przestarzała (podobnie jak strona), więc pozwól mi wskazać jeden z gotowych do użycia, ale kompaktowych przykładów setup.py, które lubię:
- Podaje się bardzo praktyczny przykład / implementacja mieszania skryptów i pojedynczych plików Pythona w setup.py tutaj
- Jeszcze lepszy od hyperopt
Ten cytat pochodzi z przewodnika po stanie setup.py i nadal obowiązuje:
- setup.py zniknął!
- distutils odszedł!
- dystrybucja nie ma!
- pip i virtualenv zostaną tutaj!
- jajka ... zniknęły!
Dodaję jeszcze jeden punkt (ode mnie)
Polecam, aby uzyskać pewne zrozumienie pakowania ekosystemu (od przewodnika wskazanych przez gotgenes) przed przystąpieniem do bezmyślnego kopiowania i wklejania.
Większość przykładów w Internecie zaczyna się od
from distutils.core import setup
ale to na przykład nie obsługuje budowania pythona w jajku setup.py bdist_egg (jak również innych starych funkcji), które były dostępne w
from setuptools import setup
Powodem jest to, że są przestarzałe .
Teraz według przewodnika
Ostrzeżenie
Skorzystaj z pakietu Distribute zamiast pakietu Setuptools, ponieważ w tym pakiecie występują problemy, które można i nie można naprawić.
przestarzałe setuptools mają zostać zastąpione przez distutils2 , który „będzie częścią standardowej biblioteki w Pythonie 3.3”. Muszę powiedzieć, że lubiłem setuptools i jajka i jeszcze nie przekonałem się do końca wygodą distutils2. To wymaga
pip install Distutils2
i zainstalować
python -m distutils2.run install
PS
Pakowanie nigdy nie było trywialne (uczy się tego, próbując opracować nowe), więc zakładam, że wiele rzeczy poszło bez powodu. Mam tylko nadzieję, że tym razem będzie to zrobione poprawnie.
Minimalny przykład
from setuptools import setup, find_packages setup( name="foo", version="1.0", packages=find_packages(), )
Więcej informacji w dokumentach
źródło
Spójrz na ten kompletny przykład https://github.com/marcindulak/python-mycli małego pakietu Pythona. Opiera się na zaleceniach dotyczących pakowania z https://packaging.python.org/en/latest/distributing.html , używa setup.py z distutils, a ponadto pokazuje, jak tworzyć pakiety RPM i deb.
Poniżej znajduje się plik setup.py projektu (pełne źródło można znaleźć w repozytorium):
#!/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, )
a plik specyfikacji RPM, który mniej więcej jest zgodny z wytycznymi dotyczącymi pakowania Fedory / EPEL, może wyglądać następująco:
# 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
źródło
Polecam setup.py z Użytkownikiem Python Opakowań przewodnik przykładem projektu.
Podręcznik użytkownika pakietu Python „ma być autorytatywnym źródłem informacji na temat pakowania, publikowania i instalowania dystrybucji Pythona przy użyciu aktualnych narzędzi”.
źródło
Tutaj znajdziesz najprostszy możliwy przykład użycia distutils i setup.py:
https://docs.python.org/2/distutils/introduction.html#distutils-simple-example
Zakłada się, że cały kod znajduje się w jednym pliku i informuje, jak spakować projekt zawierający pojedynczy moduł.
źródło
Oto narzędzie, które napisałem, aby wygenerować prosty plik setup.py plik (szablon) z przydatnymi komentarzami i linkami. Mam nadzieję, że się przyda.
Instalacja
Stosowanie
Aby wygenerować plik setup.py po prostu wpisz terminal.
Teraz plik setup.py powinien pojawić się w bieżącym katalogu.
Wygenerowano plik 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=[] )
Treść wygenerowanego setup.py :
Oto link do repozytorium. Wypełnij bezpłatnie, aby ulepszyć rozwiązanie.
źródło