setup.py示例?

学习了这个页面之后:

http://docs.python.org/distutils/builtdist.html

我希望find一些setup.py文件来学习,以使我自己(与制作Fedora rpm文件的目标)。

这样的社区能否指出我有一些很好的例子?

完成在这里编写setup.py脚本的演练。 (有一些例子)

如果你想要一个真实世界的例子,我可以指向几个重大项目的setup.py脚本。 Django 在这里 ,pyglet的在这里 。 您可以浏览其他项目的源代码,以获取更多示例的setup.py文件。

这些不是简单的例子; 我给的教程链接有这些。 这些比较复杂,也比较实用。

您可能会发现HitchHiker包装指南很有帮助,即使它不完整。 我将从“ 快速入门”教程开始 。 也可以尝试浏览Python Package Index上的Python包 。 只需下载tarball,解压缩它,然后查看setup.py文件。 或者甚至更好,只需要浏览包列出公共源代码库的软件包,例如GitHub或BitBucket上托pipe的软件包。 你一定会在头版上碰到一个。

我最后的build议就是去尝试做一个; 不要害怕失败。 直到我自己开始制作,我才真正理解它。 在PyPI上创build一个新的包并且很容易删除它是很简单的。 所以,创build一个虚拟软件包,并玩耍。

先阅读 https://packaging.python.org/en/latest/current.html

安装工具build议

  1. 使用pip从PyPI安装Python包。
  2. 使用virtualenv或pyvenv从共享Python安装中分离出特定于应用程序的依赖关系。
  3. 使用点轮来创build车轮分配caching,以加速后续安装。
  4. 如果您正在寻找完全集成的跨平台软件栈的pipe理,请考虑构build(主要关注Web开发社区)或Hashdist或conda(主要侧重于科学界)。

包装工具build议

  1. 使用setuptools定义项目并创build源分配。
  2. 使用轮子项目中可用的bdist_wheel setuptools扩展来创build轮子。 如果您的项目包含二进制扩展,这是特别有益的。
  3. 使用麻线上传发布到PyPI。

这个an鱼已经老了,确实有一个叫python包装的拯救计划

轮子的方式

我在这里inputpythonwheels.com :

什么是车轮?

轮子是python分布的新标准,并且意在取代鸡蛋。 支持在pip> = 1.4和setuptools> = 0.8中提供。

车轮的优点

  1. 纯Python和本地C扩展包的安装更快。
  2. 避免安装时执行任意代码。 (避免setup.py)
  3. 安装C扩展不需要Windows或OS X上的编译器。
  4. 允许更好的cachingtesting和持续集成。
  5. 创build.pyc文件作为安装的一部分,以确保它们匹配使用的Python解释器。
  6. 跨平台和机器的更一致的安装。

packaging.python.org涵盖了正确的python包装(和关于轮子)的完整故事


conda的方式

对于科学计算(这也build议在packaging.python.org,见上)我会考虑使用CONDA包装 ,这可以被看作是在PyPI和pip工具之上构build的第三方服务。 它也可以很好的build立你自己的binstar版本,所以我可以想象它可以完成复杂的定制企业软件包pipe理。

Conda可以安装到一个用户文件夹(没有超级用户权限),并像魔术一样工作

conda安装

和强大的虚拟env扩展。


鸡蛋的方式

这个选项与python-distribute.org有关,并且已经过时了(和网站一样),所以让我们指点一下你可以使用的紧凑的setup.py例子:

  • 将脚本和单个python文件混合到setup.py中的一个非常实用的示例/实现在这里给出
  • 更好的一个来自hyperopt

这个引用来自setup.py状态指南,仍然适用:

  • setup.py没了!
  • distutils消失了!
  • 散发了!
  • 点子和virtualenv在这里留下来!
  • 蛋…走了!

我再加一点(从我)

  • 车轮

在尝试无意识的复制粘贴之前,我会build议对包装生态系统 (来自gotgenes指导的指南)有所了解。

在互联网上的大多数例子都是从这里开始的

 from distutils.core import setup 

但是这个例子不支持构build一个蛋蟒setup.py bdist_egg (以及一些其他的function),这是可用的

 from setuptools import setup 

原因是他们被弃用

现在根据指南

警告

请使用分发软件包而不是Setuptools软件包,因为此软件包中有问题可以解决,也可以不解决。

不推荐使用的setuptools将被distutils2replace, distutils2将“将成为Python 3.3标准库的一部分”。 我必须说,我喜欢setuptools和鸡蛋,还没有完全信服distutils2方便。 这个需要

 pip install Distutils2 

并进行安装

 python -m distutils2.run install 

PS

包装从来不是微不足道的(通过尝试开发新包装来学习这一点),所以我认为很多事情都是有原因的。 我只是希望这一次是正确的。

在这里你可以find使用distutils和setup.py最简单的例子:

https://docs.python.org/2/distutils/introduction.html#distutils-simple-example

这假设你所有的代码都在一个文件中,并告诉如何打包一个包含单个模块的项目。

看看这个完整的示例https://github.com/marcindulak/python-mycli的一个小python包。; 它基于https://packaging.python.org/en/latest/distributing.html中的打包build议,使用setup.py和distutils,另外还介绍了如何创buildRPM和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 eg in tests package_data = {name: [os.path.join(name, 'tests', 'prt.txt')]} # The current version number - MSI accepts only version XXX 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 (eg 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='XY@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规范文件,这些文件或多或less地遵循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 <XY@Z.com> - 0.0.1-1 - initial version 

我推荐Python Packaging用户指南的示例项目的setup.py 。

“Python打包用户指南”旨在成为关于如何使用当前工具打包,发布和安装Python发行版的权威资源“。