ПРОЧИТАЙТЕ ЭТО Вначале https://packaging.python.org/en/latest/current.html
Рекомендации по установке
- Используйте pip для установки пакетов Python из PyPI.
- Используйте virtualenv или pyvenv, чтобы изолировать зависимости приложения от общей установки Python.
- Используйте pip wheel для создания кеша распределений wheel, чтобы> ускорить последующие установки.
- Если вы ищете управление полностью интегрированными кросс-платформенными стеками программного обеспечения, подумайте о buildout (в первую очередь ориентированном на сообщество веб-разработчиков), Hashdist или conda (оба в первую очередь ориентированы на научное сообщество).
Рекомендации по упаковочным инструментам
- Используйте setuptools для определения проектов и создания исходных дистрибутивов.
- Используйте расширение bdist_wheel setuptools, доступное в проекте wheel, для создания колес. Это особенно полезно, если ваш проект содержит двоичные расширения.
- Используйте шпагат для загрузки дистрибутивов в PyPI.
Этот anwser устарел, и действительно существует план спасения мира упаковки Python под названием
колеса путь
Я цитирую pythonwheels.com здесь:
Какие колеса?
Колеса - это новый стандарт распространения Python, предназначенный для замены яиц. Поддержка предлагается в pip> = 1.4 и setuptools> = 0.8.
Преимущества колес
- Более быстрая установка пакетов расширений на чистом Python и нативном языке C.
- Избегает выполнения произвольного кода для установки. (Избегает setup.py)
- Для установки расширения C не требуется компилятор в Windows или OS X.
- Обеспечивает лучшее кэширование для тестирования и непрерывной интеграции.
- Создает файлы .pyc как часть установки, чтобы убедиться, что они соответствуют используемому интерпретатору python.
- Более согласованная установка на разных платформах и машинах.
Полную историю правильной упаковки Python (и о колесах) можно найти на package.python.org.
Конда путь
Для научных вычислений (это также рекомендуется на package.python.org, см. Выше) я бы подумал об использовании упаковки CONDA, которая может рассматриваться как сборка сторонних сервисов поверх PyPI и инструментов pip. Он также отлично работает при настройке вашей собственной версии binstar, поэтому я могу представить, что он может помочь в сложном управлении пользовательскими корпоративными пакетами.
Conda может быть установлена в папку пользователя (без прав суперпользователя) и работает как по волшебству с
установка conda
и мощное расширение виртуального окружения.
путь яиц
Этот вариант был связан с python-distribute.org и значительно устарел (как и сам сайт), поэтому позвольте мне указать вам на один из готовых к использованию, но компактных примеров setup.py, которые мне нравятся:
- Очень практический пример / реализация смесительных скриптов и отдельных файлов питона в setup.py дает здесь
- Еще лучше от гиперопта
Эта цитата была взята из руководства по состоянию setup.py и действует до сих пор:
- setup.py ушел!
- distutils ушел!
- раздача пошла!
- pip и virtualenv здесь, чтобы остаться!
- яйца ... пропали!
Я добавляю еще один балл (от себя)
Я бы порекомендовал получить некоторое представление об экосистеме упаковки (из руководства, на которое указал gotgenes), прежде чем пытаться бездумно копировать.
Большинство примеров в Интернете начинаются с
from distutils.core import setup
но это, например, не поддерживает сборку яйца python setup.py bdist_egg (а также некоторые другие старые функции), которые были доступны в
from setuptools import setup
Причина в том, что они устарели .
Теперь по гиду
Предупреждение
Используйте пакет Distribute, а не пакет Setuptools, потому что в этом пакете есть проблемы, которые можно и не будут устранять.
устаревшие инструменты установки должны быть заменены на distutils2 , который «станет частью стандартной библиотеки в Python 3.3». Я должен сказать, что мне понравились инструменты настройки и яйца, и я еще не был полностью убежден в удобстве distutils2. Это требует
pip install Distutils2
и установить
python -m distutils2.run install
PS
Упаковка никогда не была тривиальной (это можно понять, пытаясь разработать новую), поэтому я полагаю, что многие вещи пошли не так, как надо. Я просто надеюсь, что на этот раз все будет сделано правильно.
Минимальный пример
from setuptools import setup, find_packages setup( name="foo", version="1.0", packages=find_packages(), )
Подробнее в документах
источник
Взгляните на этот полный пример https://github.com/marcindulak/python-mycli небольшого пакета Python. Он основан на рекомендациях по упаковке из https://packaging.python.org/en/latest/distributing.html , использует setup.py с distutils и, кроме того, показывает, как создавать пакеты RPM и deb.
Ниже приведен файл setup.py проекта (полный исходный код см. В репо):
#!/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, )
и файл спецификации RPM, который более или менее соответствует рекомендациям по упаковке Fedora / EPEL, может выглядеть так:
# 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
источник
Я рекомендую файл setup.py из примера проекта Руководства пользователя по упаковке Python .
Руководство пользователя Python Packaging «стремится стать авторитетным ресурсом о том, как упаковывать, публиковать и устанавливать дистрибутивы Python с использованием текущих инструментов».
источник
Здесь вы найдете простейший пример использования distutils и setup.py:
https://docs.python.org/2/distutils/introduction.html#distutils-simple-example
Это предполагает, что весь ваш код находится в одном файле, и сообщает, как упаковать проект, содержащий один модуль.
источник
Вот утилита, которую я написал для создания простого файла (шаблона) setup.py с полезными комментариями и ссылками. Надеюсь, это будет полезно.
Установка
Применение
Для создания файла setup.py просто введите терминал.
Теперь в текущем каталоге должен появиться файл setup.py .
Создан 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=[] )
Содержимое сгенерированного setup.py :
Вот ссылка на репозиторий. Заливайте бесплатно, чтобы усилить раствор.
источник